简析 Android Adapter适配器的内部调用流程
2013-11-21 22:58
330 查看
我们都知道使用Adapter为ListView或GridView填充数据,而我们需要实现Adapter里的getView、getCount等方法。但内部到底是怎么调用,怎么调用的getView方法,就需要看源码了,下面来简单分析一下:
以GridView为例,为它设置适配器的方法是GridView.setAdapter:
了解了这些之后,就可以清楚的了解适配器的调用流程了:
场景1:我们在为GridView设置Adapter(GridView.setAdapter)时最终会调用 “重绘(1)”,然后就会一直调用到GridView的onMeasure方法,在onMeasure方法里就会调用Adapter的getcount、getView等方法获取数据了。
场景2:当数据源改变,我们会调用adapter的notifyDataSetChanged方法来刷新数据,这样会触发Adapter中注册的监听器,最终会调用“重绘(2)”,之后就同场景1的过程一样来获取adapter的数据了。
以GridView为例,为它设置适配器的方法是GridView.setAdapter:
@Override public void setAdapter(ListAdapter adapter) { 。。。。。。 mDataSetObserver = new AdapterDataSetObserver(); mAdapter.registerDataSetObserver(mDataSetObserver); 。。。。。。 requestLayout();//调用了requestLayout重绘布局方法,简称 重绘(1)。 }
方法中为adapter注册了一个监听器AdapterDataSetObserver,它存在于GridView的父类AbsListView中(其实这个监听器的真正实现是在AdapterView类中),这个监听器有一个主要的监听方法:
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(); requestLayout();//注意这里也调用了重绘布局方法,简称 重绘(2)。 }
requestLayout会向系统发一个重新布局的message,重新布局就要重新测量,就要走measure流程,最终会调用到GridView中的onMeasure方法(具体过程可查看android内核剖析的第十三章关于View的绘制内容)。而在GridView的onMeasure中就会调用为GridView设置的Adapter对象的getCount、getItemType方法还会调用一个obtainView(存在于GridView的父类AbsListView中),obtainView中会就会调用Adapter的getView方法来获得单个Item的View了。
了解了这些之后,就可以清楚的了解适配器的调用流程了:
场景1:我们在为GridView设置Adapter(GridView.setAdapter)时最终会调用 “重绘(1)”,然后就会一直调用到GridView的onMeasure方法,在onMeasure方法里就会调用Adapter的getcount、getView等方法获取数据了。
场景2:当数据源改变,我们会调用adapter的notifyDataSetChanged方法来刷新数据,这样会触发Adapter中注册的监听器,最终会调用“重绘(2)”,之后就同场景1的过程一样来获取adapter的数据了。
相关文章推荐
- Android酱油笔记之关于退出所有Avtivity
- Android学习笔记(环境配置):使用Google Map API v2
- Nexus 5 官方使用教程汇总
- android大扫盲之SurfaceView,SurfaceHolder,SurfaceHolder.CallBack.你hold住了吗
- Android Wi-Fi Display(Miracast)介绍
- Android开发14――监听内容提供者ContentProvider的数据变化
- Android中的声音控制
- Android App 图表制作之--ichartJs
- 【Android 开发】: Android客户端与服务端之间使用GSON交互数据。
- android自定义ExpandableListView
- Android的5个进程等级
- 安卓系统源码编译系列(五)——so库的源码路径列表
- Android:Camera
- Android getContentLength()为-1 解决方法
- android中TextView实时跟踪EditText输入的问题
- Android系统启动过程
- iPhone短信导入到Android手机的方法
- Android移动应用界面的模板化设计
- Android错误总结-E/AndroidRuntime(23439): Caused by: java.lang.IllegalArgumentException: column 'id' d
- android]ListView+SimpleCursorAdapter+checkbox实现批量删除