ListView如何单独刷新一个item

扣扣技术交流群: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");
        }
}

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值