昨天某同学要转行做android,我问他ListView的Adapter用哪个,他说用SimpleAdapter。如果对Adapter的认识只停留在SimpleAdapter不是很够力啊。在学习android的时候大体都经历了SimpleAdapter->BaseAdapter的过程。对于一般应用,到BaseAdapter也就够了。BaseAdapter是ListAdapter的子类,给开发者提供了一些不常用方法的默认实现。而android还提供了更多的功能要靠ListAdapter接口使用。我假设看官们已经熟悉了BaseAdapter的使用,也知道了ListView重用view来展示数据这一点。所以捡重点说。

1. 关于刷新顺序

long getItemId(int position)boolean hasStableIds()

getItemId是干嘛用的?在调用 invalidateView()时,ListView会刷新显示内容。如果内容的id是有效的,系统会跟据id来确定当前显示哪条内容,也就是firstVisibleChild的位置。id是否有效通过hasStableIds()确定。

2. 关于内容类型

int getItemViewType(int position)int getViewTypeCount()

如果ListView需要显示多种类型的内容,就需要有不同的缓存拿来使用。举个例子,position是奇数时getView()返回的是A类型的View;偶数的时候返回B类型的View。那么就需要在getViewTypeCount()中返回2;在getItemViewType()中当position是单数时返回一个值,双数时返回另外一个值。ListView根据返回值缓存和重用View,这样在getView()中调用强制类型转换就不会出现类型转换错误了。

不同类型的View也可一用FrameLayout集成在一个View中显示,这样View的结构就会变得很复杂,而且消耗更多的内存。

3. 关于点击

boolean areAllItemsEnabled()boolean isEnabled(int position)
如果不希望Item点击时出现背景颜色,就使用这两个方法。它们分别针对所有和单个View实现。以前找这个东西都是从ListView中找,却没注意它就在Adapter中。

4. 观察者模式?

registerDataSetObserver(DataSetObserver observer)unregisterDataSetObserver(DataSetObserver observer)
这两个方法是系统希望在Adapter中数据有变化时得到通知。通知做啥?刷新进图条的长度^_^。

总的来说,android对ListView的考虑还是比较细致的。作为一般使用BaseAdapter就够用了,需要显示不同类型的View等特殊控制时去实现别的方法。


更多相关文章

  1. android中完全退出当前应用程序的四种方法
  2. Android创建桌面快捷方式几种方法
  3. Android中获取控件宽高的4大方法
  4. Android 设备网络信息的获取(网络类型、网络强度、网络速度、代理
  5. android内容提供者
  6. Android 6.0开发实现关机菜单添加重启按钮的方法
  7. google被墙后,Android SDK下载和更新失败的解决方法!
  8. HierarchyView的实现原理和Android设备无法使用HierarchyView的
  9. SONY 系列手机 Android 5.1 系统 Root 方法

随机推荐

  1. Android的安装过程
  2. Android(安卓)AsyncTask 原理及Java多线
  3. Android(安卓)studio gradle文件说明与配
  4. Android(安卓)四种绑定监听事件的方式
  5. android,java只是知识点总结
  6. android 实现圆角imageView的两种方法
  7. Android(安卓)学习笔记--android——list
  8. 多个viewpager导致的不显示问题
  9. android 实现男女按钮选择
  10. Android内存泄漏检测工具:LeakCanary