源码分析listview的adapter的notifyDataSetChanged方法分析

本文详细解析了Android中ListView控件的刷新机制,重点介绍了通过调用adapter的notifyDataSetChanged方法触发刷新的过程,包括如何通过DataSetObserver监听数据变化并最终触发UI更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们在使用listview控件的时候,总是会因为数据的改变,而需要更新listview控件的内容,这时候总是会调用adapter的notifyDataSetChanged()方法,现在分析一下,调用这个方法具体实现了什么步骤。
首先调用了mDataSetobservable.notifyChanged() (DataSetObservable类)方法
这里写图片描述
接着 循环调用了 在DataSetObservable类中 mObservers.onChanged()方法 , mObservers是什么东西呢??因为DataSetObservable继承Observable这个类, 我们去看看!!
这里写图片描述

可以看到 mObserve就是一个List集合
这里写图片描述

这里写图片描述

可是,由前面可知道调用mObserver.change()方法,就是调用DataSetObservable里面的onchange()方法,可是我进去看却没有里面什么都没有实现,可见在别的地方重写了该方法,我们在setAdapter里面找到了,下面遮住的是就是注册
这里写图片描述

AdapterDataSetObserver就是继承了DataSetObservable类在里面重写了onchange()函数

  @Override
        public void onChanged() {
            mDataChanged = true;
            mOldItemCount = mItemCount;
            mItemCount = getAdapter().getCount();

            // Detect the case where a cursor that was //previously invalidated has
            // been repopulated with new data.
 if (AdapterView.this.getAdapter().hasStableIds() && mInstanceState != null
                    && mOldItemCount == 0 && mItemCount > 0)
         {
                AdapterView.this.onRestoreInstanceState(mInstanceState);
                mInstanceState = null;
            } else {
                rememberSyncState();
            }
            checkFocus();
            //会导致调用measure()过程 和 layout()过程
            requestLayout();
        }

requestLayout()进行布局和重绘。
我们可以简单梳理一下更新的过程: listview通知刷新,首先实现一个DataSetObserver类,重写里面的onChanged回调方法,然后把这个对象添加(注册)到ArrayList中,这样当我们调用notifyDataSetChanged的时候,它会遍历这个ArrayList取出DataSetObserver对象(正常来说就一个,只调用一次setAdapter),回调onChanged方法。onChanged里面就的requestLayout就实现重新绘制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值