Android ListView 局部更新 单条数据刷新


版权声明:本篇文章,为博主 cnbzlj 原创。此篇为转载!!!

原文地址:https://www.niwoxuexi.com/blog/cnbzlj/article/1010



今天,简单讲讲 android 如何对 ListView 进行局部刷新。

之前,自己做的ListView 发现刷新频率太高了,而且很多界面上看不到的数据改变时调用Adapter.notifyDataSetChanged()也会导致整个ListView 进行刷新。其实我们只需在界面元素改变时刷新界面那个改变的item就可以。如果不停刷新这个界面,会导致效率减低。所以在网上搜索了资料,最终解决了问题。

平时在写ListView的时候需要更改某些数据,这种情况我们一般会调用

notifyDataSetChanged()方法进行刷新,调用notifydatasetchange其实会导致adpter的getView方法被多次调用(画面上能显示多少就会被调用多少次),并且在有获取网络图片的情况下会可能造成大量闪动或卡顿,极大的影响用户体验(图片重新加载并闪动在ImageLoader框架中会出现,在glide框架中没有出现)。

所以我们需要做单行刷新来进行优化


这个是Google官方给出的解决方案:

private void updateSingleRow(ListView listView, long id) {  
 
    if (listView != null) {  
        int start = listView.getFirstVisiblePosition();  
        for (int i = start, j = listView.getLastVisiblePosition(); i <= j; i++)  
            if (id == ((Messages) listView.getItemAtPosition(i)).getId()) {  
                View view = listView.getChildAt(i - start);  
                getView(i, view, listView);  
                break;  
            }
    }  
}



简单讲讲,其实就是通过改变数据的位置找到对应的ListView 界面元素的位置,直接调用adpter.getView(i, view, listView); 进行局部刷新。上面的代码也可以简写为:

/**
 * 局部更新数据,调用一次getView()方法;Google推荐的做法
 *
 * @param listView 要更新的listview
 * @param position 要更新的位置
 */
public void notifyDataSetChanged(ListView listView, int position) {
    /**第一个可见的位置**/
    int firstVisiblePosition = listView.getFirstVisiblePosition();
    /**最后一个可见的位置**/
    int lastVisiblePosition = listView.getLastVisiblePosition();

    /**在看见范围内才更新,不可见的滑动后自动会调用getView方法更新**/
    if (position >= firstVisiblePosition && position <= lastVisiblePosition) {
        /**获取指定位置view对象**/
        View view = listView.getChildAt(position - firstVisiblePosition);
        adpter.getView(position, view, listView);
    }

}



这个也是一样,先判断刷新元素是否在ListView 的可见位置,如果在就直接调用adpter.getView(position, view, listView);进行刷新。

android ListView 局部刷新就讲完了。

就这么简单。




最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容