ListView中的观察者模式

ListView中的观察者模式

ID:37859484

大小:54.50 KB

页数:8页

时间:2019-06-01

ListView中的观察者模式_第1页
ListView中的观察者模式_第2页
ListView中的观察者模式_第3页
ListView中的观察者模式_第4页
ListView中的观察者模式_第5页
资源描述:

《ListView中的观察者模式》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、ListView中的观察者模式虽然现在RecyclerView很好用,也在逐渐替代ListView。很多github的开源大神也在对其进行更加实用的封装。我现在写的一个音乐播放器也在使用RecyclerView。但是这些都不阻碍我们学习ListView优秀的源码设计。播放器我想要写的精美,但现在越写越多bug,这也应该是我离开大学校园,实习前的最后一个小作品了,接下来的半年多的时间要冲刺复习咯。进入正题,我用的是Api-23的源码。接下来就从源码的角度带你学习ListView中的观察者模式当我们开启异步线程,向服务端拉取数据

2、后,数据源已经更新了,此时想要更新ListView的视图以显示新的数据。ListView使用了Adapter模式,很简单只需一行代码就能完成ListView的更新。mAdapter.notifyDataSetChanged();那么这里引出一个问题,更新ListView的工作,是Adapter完成的还是ListView自身内部完成的?可以先猜想一下再往下看。因为我之前已经学习过自定义控件,所以我看源码之前猜想是ListView完成的。惯性使然,我想到他可能是调用了onLayout(),onDraw()等方法呀,去重新布局,绘

3、制那接下来就解开疑惑吧。先找到源头,从ListView绑定Adapter那里开始。mListView.setAdapter(mAdapter);ListView和Adapter就是用这行代码建立起关联的。那么跟踪setAdapter方法进去:publicvoidsetAdapter(ListAdapteradapter){if(mAdapter!=null&&mDataSetObserver!=null){mAdapter.unregisterDataSetObserver(mDataSetObserver);}resetL

4、ist();mRecycler.clear();if(mHeaderViewInfos.size()>0

5、

6、mFooterViewInfos.size()>0){mAdapter=newHeaderViewListAdapter(mHeaderViewInfos,mFooterViewInfos,adapter);}else{mAdapter=adapter;}mOldSelectedPosition=INVALID_POSITION;mOldSelectedRowId=INVALID_ROW_ID;//AbsListVie

7、w#setAdapterwillupdatechoicemodestates.super.setAdapter(adapter);if(mAdapter!=null){mAreAllItemsSelectable=mAdapter.areAllItemsEnabled();mOldItemCount=mItemCount;mItemCount=mAdapter.getCount();checkFocus();mDataSetObserver=newAdapterDataSetObserver();mAdapter.regis

8、terDataSetObserver(mDataSetObserver);mRecycler.setViewTypeCount(mAdapter.getViewTypeCount());intposition;if(mStackFromBottom){position=lookForSelectablePosition(mItemCount-1,false);}else{position=lookForSelectablePosition(0,true);}setSelectedPositionInt(position);s

9、etNextSelectedPositionInt(position);if(mItemCount==0){//NothingselectedcheckSelectionChanged();}}else{mAreAllItemsSelectable=true;checkFocus();//NothingselectedcheckSelectionChanged();}requestLayout();}方法是这样开始的if(mAdapter!=null&&mDataSetObserver!=null){mAdapter.unr

10、egisterDataSetObserver(mDataSetObserver);}先判断mAdapter!=null&&mDataSetObserver!=nullmAdapter肯定是不为null的,那么mDataSetObserver呢?这个引用是哪里被赋值的,先不管,继续往下看se

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。