您的位置:首页 > 其它

ListView 局部刷新

2017-02-09 13:39 363 查看
转载请注明出处:http://blog.csdn.net/darling_R/article/details/54946362

本文出自:哎呀小嘿的博客

在软件里面,list列表几乎是必不可少的,但是有时候需要刷新列表,而notifyDataSetChanged()又是刷新全部数据,性能就会相对下降,为了解决定向刷新某一条数据,特意写了瓷片文章,希望能对一些需要的人有帮助,废话不多说,直接上代码。

这里是MainActivity:

public class MainActivity extends AppCompatActivity {

private ArrayList<MyListItem> list = null;
private ListView lv;
private MyListAdapter adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intitData();
lv = (ListView) findViewById(R.id.listView1);
adapter = new MyListAdapter(list, getApplicationContext());
adapter.setListView(lv);
lv.setAdapter(adapter);

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// 获取listview中点击item的数据
MyListItem item = (MyListItem) parent.getItemAtPosition(position);
Log.i("eee", item.getData() + " == " + item.getPosition());
// 更新数据
item.setData("update item " + position);
// 更新界面
adapter.updateItemData(item);
}
});

}

/**
* 初始化数据
*/
private void intitData() {
list = new ArrayList<>();
for (int i = 0; i < 20; i++) {
MyListItem item = new MyListItem();
item.setData("item " + i);
item.setPosition(i);
list.add(item);
}
}

}


关键代码还是 adapter里面的:

public class MyListAdapter extends BaseAdapter {

/**
* listview中的数据集
*/
private ArrayList<MyListItem> mDataList;

private Context mContext;
private ListView mListView;

public MyListAdapter(ArrayList<MyListItem> list, Context cont) {
this.mDataList = list;
this.mContext = cont;
}

/**
* 设置listview对象
*
* @param lisv
*/
public void setListView(ListView lisv) {
this.mListView = lisv;
}

/**
* update listview 单条数据
*
* @param item 新数据对象
*/
public void updateItemData(MyListItem item) {
Message msg = Message.obtain();
int ids = -1;
// 进行数据对比获取对应数据在list中的位置
for (int i = 0; i < mDataList.size(); i++) {
if (mDataList.get(i).getPosition() == item.getPosition()) {
ids = i;
}
}
msg.arg1 = ids;
// 更新mDataList对应位置的数据
mDataList.set(ids, item);
// handle刷新界面
han.sendMessage(msg);
}

@SuppressLint("HandlerLeak")
private Handler han = new Handler() {
public void handleMessage(android.os.Message msg) {
updateItem(msg.arg1);
}
};

/**
* 刷新指定item
*
* @param index item在listview中的位置
*/
private void updateItem(int index) {
if (mListView == null) {
return;
}

// 获取当前可以看到的item位置
int visiblePosition = mListView.getFirstVisiblePosition();
// 如添加headerview后 firstview就是hearderview
// 所有索引+1 取第一个view
// View view = listview.getChildAt(index - visiblePosition + 1);
// 获取点击的view
View view = mListView.getChildAt(index - visiblePosition);
TextView txt = (TextView) view.findViewById(R.id.textView1);
// 获取mDataList.set(ids, item);更新的数据
MyListItem data = (MyListItem) getItem(index);
// 重新设置界面显示数据
txt.setText(data.getData());
}

@Override
public int getCount() {
return mDataList.size();
}

@Override
public Object getItem(int position) {
return mDataList.get(position);
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(mContext).inflate(R.layout.list_item, null);
}
TextView txt = (TextView) convertView.findViewById(R.id.textView1);
txt.setText(mDataList.get(position).getData());
return convertView;
}


代码里面注释写的都很清楚了,这里就不在赘述了。

数据类:

public class MyListItem {
/**
* 数据id
*/
private int dataId;
/**
* 数据
*/
private String data;

public int getPosition() {
return dataId;
}

public void setPosition(int position) {
this.dataId = position;
}

public String getData() {
return data;
}

public void setData(String data) {
this.data = data;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  listview 局部刷新