概述
在使用ListView的时候,我们都会对列表数据进行更新,当数据变化时,我们会调用adapter的notifyDataSetChange方法去刷新列表。但是,该刷新方法是使整个列表都更新一遍(调用了adapter的getView方法)。而,我们往往只是更新了item中的某一项数据,如果刷新整个列表是不是显得太过于浪费了,特别是对于列表中有图片要显示的情况下,就会造成每次notifyDataSetChange图片会闪烁抖动。本文意在解决该问题,让数据更新只在局部。
解决方案
- 情景再现
下面例子的效果是,列表数据显示的是一系列数字,点击列表的item项时,该列表数字加1。那么一般的代码实现如下:
定义一个adapter
MyAdapter.java
public class MyAdapter extends BaseAdapter{
private Context context;
private List<Integer> datas;
public MyAdapter(Context context,List<Integer> datas){
this.context = context;
this.datas = datas;
}
@Override
public int getCount() {
if(datas != null){
return datas.size();
}
return 0;
}
@Override
public Integer getItem(int position) {
return datas.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if(convertView == null){
convertView = LayoutInflater.from(context).inflate(R.layout.item_adapter,parent,false);
holder = new ViewHolder();
holder.textView = (TextView) convertView.findViewById(R.id.textview);
convertView.setTag(holder);
}else {
holder = (ViewHolder) convertView.getTag();
}
holder.textView.setText(String.valueOf(getItem(position)));
return convertView;
}
private class ViewHolder{
TextView textView;
}
}
item 布局这里只是简单的一个TextView
item_adapter.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"