扣扣技术交流群:460189483
对于ListView数据的刷新大家都知道,改变Adapter的数据源,然后调用Adapter的notifyDateSetChanged()方法即可。
但是我在做公司项目的时候,我的listview有几个item,只有一个item数据需要实时更新,其它都是图片跟文字,不需要更新。因为要实时更新,所以要不停的调用notifyDateSetChanged刷新数据。这样会不停的重新绘制整个listview的界面,性能开销非常大。而且item有图片的话,每个item的图片都需要重新加载,就算图片做了内存缓存,刷新一下图片也会闪一下,不停的刷新就会导致各个item的图片不停的闪,体验一点都不好。
那么对于上面问题,有没有解决办法呢?当然是有的。我们可以针对某一个item进行局部更新,而不影响其它没有修改的item。那么具体如何实现的呢?有两种实现方式,一种是使用ListView适配器中的ViewHolder找到TextView,另一种是通过API找到,代码见如下
private void updateItem(int itemIndex){
if(listView == null){
return;
}
//获取第一个可以看到的item位置
int firstVisiblePosition=listView.getFirstVisiblePostion();
//获取最后一个可以看到的item位置
int lastVisiblePosition=listView.getLastVisiblePostion();
//判断是否在范围内
if ((itemIndex >= firstVisiblePosition && itemIndex<=lastVisiblePosition) {
//得到要更新的item的view
View view = listView.getChildAt(itemIndex - firstVisiblePosition);
//方法一:获取ViewHolder,间接获取TextView
ViewHolder viewHolder = (ViewHolder)view.getTag();
//获取TextView
TextView tv_item = viewHolder.tv_item;
//更改数据,其实两步可以合并一步viewHolder.tv_item.setText("hello")
tv_item.setText("hello");
//方法二,直接获取TextView
TextView tv_item = view.findViewById(R.id.tv_item);
tv_item.setText("hello");
}
}
2种方法哪种更高效留给自己考虑,亲测都没有问题
我个人比较倾向于使用第一种,可扩展性比较强!
如果要把ListView中所有需要实时显示的item都更改怎么弄呢?其实只需要稍微修改就可以了,见如下代码:
private void updateItem(){
if(listView == null){
return;
}
//获取第一个可以看到的item位置
int firstVisiblePosition=listView.getFirstVisiblePostion();
//获取最后一个可以看到的item位置
int lastVisiblePosition=listView.getLastVisiblePostion();
//判断是否在范围内
for (int i = firstVisiblePosition; i <= lastVisiblePosition; i++) {
//得到要更新的item的view
View view = listView.getChildAt(i);
//方法一:获取ViewHolder,间接获取TextView
ViewHolder viewHolder = (ViewHolder)view.getTag();
//获取TextView
TextView tv_item = viewHolder.tv_item;
//更改数据,其实两步可以合并一步viewHolder.tv_item.setText("hello")
tv_item.setText("hello");
//方法二,直接获取TextView
TextView tv_item = view.findViewById(R.id.tv_item);
tv_item.setText("hello");
}
}