ListView单条item刷新
在使用listView显示很多数据时当有一条数据发送改变需要刷新某条数据时,一般会调用Adapter.notifyDataSetChanged()来进行刷新。 但会造成体验不好,尤其是下载列表会高频率调动Adapter.notifyDataSetChanged()会造成UI绘制资源的浪费进而影响性能。
代码模块Activity
public class ActivityA extends AppCompatActivity {
ListView listView;
MyAdapter myAdapter = null;
List<String> datas;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setDatas();
myAdapter = new MyAdapter(this, datas);
listView = new ListView(this);
setContentView(listView);
listView.setAdapter(myAdapter);
}
public void setDatas() {
datas = new ArrayList<>();
for (int index = 0; index < 30; index++) {
datas.add("第" + index + "条数据");
}
}
}
代码适配器
public class MyAdapter extends BaseAdapter {
private List<String> mData;
private Context mCtx;
private LayoutInflater inflater;
public MyAdapter(Context context, List<String> data) {
this.mCtx = context;
this.mData = data;
notifyDataSetChanged();
inflater = LayoutInflater.from(mCtx);
}
@Override
public int getCount() {
return mData == null ? 0 : mData.size();
}
@Override
public String getItem(int position) {
return mData.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
convertView = inflater.inflate(R.layout.adapter_layout, parent);
holder = new ViewHolder();
holder.tv = convertView.findViewById(R.id.tv);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.tv.setText(getItem(position));
return convertView;
}
class ViewHolder {
TextView tv;
}
}
下面列举局部刷方式:
一、更新对于View的内容
/**
* 方法一:更新对应View的内容
*/
private void upItemView() {
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
datas.set(position, "我被点击了,请更新第" + position + "条数据");
/**第一个可见的位置**/
int firstVisiblePosition = listView.getFirstVisiblePosition();
/**最后一个可见的位置**/
int lastVisiblePosition = listView.getLastVisiblePosition();
/**在看见范围内才更新,不可见的滑动后自动会调用getView方法更新**/
if (position >= firstVisiblePosition && position <= lastVisiblePosition) {
View childView = listView.getChildAt(position - firstVisiblePosition);
TextView textView = childView.findViewById(R.id.tv);
textView.setText(datas.get(position));
}
}
});
}
二、使用Adapter.getView方法更新局部数据(这种方法是调用适配器对应的getView方法,用它里面的代码对界面进行刷新。这也是google在IO大会上推荐的做法)
/**
* 二、使用Adapter.getView方法更新局部数据
*/
private void upItemView() {
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
datas.set(position, "我被点击了,请更新第" + position + "条数据");
int firstVisiblePosition = listView.getFirstVisiblePosition();
int lastVisiblePosition = listView.getLastVisiblePosition();
/**在看见范围内才更新,不可见的滑动后自动会调用getView方法更新**/
if (position >= firstVisiblePosition && position <= lastVisiblePosition) {
View childView = listView.getChildAt(position - firstVisiblePosition);
myAdapter.getView(position, childView, listView);
}
}
});
}