1  ListView是在什么时候设置对Adapter的数据监听的?

在setAdapter(ListAdapter adapter)中,会先取消ListView中原来的mAdapter中的数据监听(mAdapter.unregisterDataSetObserver(mDataSetObserver);),然后再设置对新设置的adapter的数据监听。

2  getView(int position, View convertView, ViewGroup parent)

我们都知道mAdapter的getView方法很重要,那么该方法在ListView是怎么被利用的呢? 在ListView的源码中没有发现getView方法的调用,于是我们去ListView的父类AbsListView。在AbsListView中的obtainView中调用了getView,其主要代码逻辑部分为:

     View obtainView(int position, boolean[] isScrap) {
isScrap[0] = false;
View scrapView;
//从回收器中获取view
scrapView = mRecycler.getScrapView(position); View child;
if (scrapView != null) {
...
//若不为空,则传入convertView,这样的话重用了view,同时更新了数据
child = mAdapter.getView(position, scrapView, this);
...
} else {
//若为空,则在getView中重新创建HolderView,且填入数据
child = mAdapter.getView(position, null, this);
...
}
return child;
}

而obtainView又会在ListView的measure以及生成整个ListView等中用到。

对于重写getView方法最终要的应该就是要记得convertView的重用了,没有重用几乎都会造成内存卸了。

3  getCount()

Adapter的getCount()用来干啥?  在ListView中,在onMeasure以及触控分发响应等过程中都会用到Adapter的getCount()函数。毫无疑问的是:它应该返回底层数据的数据个数。

4  getItem(int position)

getItem()在AdapterView中被调用,然后供用户调用:从这两个函数的描述我们可以看出,我们应该在Adapter的getItem()方法中返回position对应的数据,但是不是说一定要返回用于在Item的View上展示的数据,这个还是看需求,虽然可能大部分情况都是返回View中展示的数据。

    /**
* Gets the data associated with the specified position in the list.
*
* @param position Which data to get
* @return The data associated with the specified position in the list
*/
public Object getItemAtPosition(int position) {
T adapter = getAdapter();
return (adapter == null || position < 0) ? null : adapter.getItem(position);
} /**
* @return The data corresponding to the currently selected item, or
* null if there is nothing selected.
*/
public Object getSelectedItem() {
T adapter = getAdapter();
int selection = getSelectedItemPosition();
if (adapter != null && adapter.getCount() > 0 && selection >= 0) {
return adapter.getItem(selection);
} else {
return null;
}
}

纵观整个结构,可以说存在这样的三层:dataLists(原底层数据)--Adapter--AdapterView,有了getItem()方法的存在,我们可以直接利用Adapter来获取数据,而不需要获取底层dataLists的引用;有了getItemAtPosition()方法的存在,我们可以直接利用AdapterView 获取底层数据,而不需要获取其Adapter的引用。这样的话,对于编程的简便性以及解耦性都好很多。

5    getItemId(int position)

在AdapterView中发现它的一些调用,

     public long getItemIdAtPosition(int position) {
T adapter = getAdapter();
return (adapter == null || position < 0) ? INVALID_ROW_ID : adapter.getItemId(position);
} private void fireOnSelected() {
if (mOnItemSelectedListener == null)
return; int selection = this.getSelectedItemPosition();
if (selection >= 0) {
View v = getSelectedView();
//这里调用的getItemId得到的返回值与selection都属于同一个item的特征,其意义也就在于在选择接口的onItemSelected方法中可
//以直接拿到该item的id,而不需要通过获取adapter来间接实现
mOnItemSelectedListener.onItemSelected(this, v, selection,
getAdapter().getItemId(selection));
} else {
mOnItemSelectedListener.onNothingSelected(this);
}
} int findSyncPosition() {
...
rowId = adapter.getItemId(seed);
if (rowId == idToMatch) { //从这里来看,getItemId似乎应该对于不同的item返回不同的值,保持唯一性
// Found it!
return seed;
}
...
}

与上面分析的getItem()方法一样,getItemId()和getItemIdAtPosition()都提供了编程上面的便利。但是目前来看,由于对id没啥需求,所以大部分在重写getItemId方法时都是直接返回的position值,这样做也是对的,虽然从数据获取上没啥意义(我给你一个position,你原封不动的返回给我,啥意思)。但是我想说明的是,不要被这个做法所限制,而以为ItemId就是item在数据中的position。其实若有需求,可以利用getItemId()方法返回一些其他的值,比如每个item数据在数据库中id值,或者每个人的身份证号等。

Android Adapter的几个方法的更多相关文章

  1. [转]Android Adapter以及getView()方法的理解

    Android Adapter基本理解: 我的理解是: 1.一个有许多getter的类(就是getView(),getCount()....这些方法) 2.有多少个get方法?都是什么? 这些gett ...

  2. Android进阶(十四)Android Adapter详解

    Android Adapter详解 Android是完全遵循MVC模式设计的框架,Activity是Controller,layout是View.因为layout五花八门,很多数据都不能直接绑定上去, ...

  3. Android Adapter基本理解

    感谢大佬:https://blog.csdn.net/l799069596/article/details/47301711 Android Adapter基本理解: 我的理解是: 1.一个有许多ge ...

  4. Android C代码回调java方法

    本文将讲述下列三种C代码回调java方法 1.c代码回调java空方法 2.c代码回调java int类型参数方法 3.c代码回调javaString类型参数方法 方法都差不多,先看c代码回调java ...

  5. android MediaPlayer API大全已经方法详解(转载)

    通过这张图,我们可以知道一个MediaPlayer对象有以下的状态: 1)当一个MediaPlayer对象被刚刚用new操作符创建或是调用了reset()方法后,它就处于Idle状态.当调用了rele ...

  6. android中的提示信息显示方法(toast应用)

    android中的提示信息显示方法(toast应用) (2011-10-17 11:02:06) 转载▼ 标签: android toast 杂谈 分类: Android android中toast的 ...

  7. 【转】Android中JNI的使用方法

    Android中JNI的使用方法 首先看一下Android平台的框架图:(网上盗用) 可以看到Android上层的Application和ApplicationFramework都是使用Java编写, ...

  8. [Android设计模式]Android退出应用程序终极方法

    如何干净彻底地退出Android应用程序,是很多开发者的心头痒.如何干净地关闭所有已打开的Activity? 如何关闭指定的Activity? 如何关闭一类Activity? 这里,我们提出一种通过实 ...

  9. 我的Android最佳实践之—— Android启动画面的实现方法

    本文实例讲述了Android启动画面的实现方法.分享给大家供大家参考.具体分析如下: 在应用程序中经常用到启动画面,会启动一个后台线程为主程序的运行准备资源.Android要实现启动画面可以这样做: ...

随机推荐

  1. .Net语言 APP开发平台——Smobiler学习日志:用Gridview控件设计较复杂的表单

    最前面的话:Smobiler是一个在VS环境中使用.Net语言来开发APP的开发平台,也许比Xamarin更方便 一.目标样式 我们要实现上图中的效果,需要如下的操作: 1.从工具栏上的”Smobil ...

  2. css3代码让页面倾斜

    教大家一个方法使用CSS把整个网页倾斜,代码只有在支持CSS3.0的浏览器上有效果.目前只有IE9以上版本及firefox高版本支持,其它浏览器没有测试.代码如下 body{ -webkit-tran ...

  3. Win10 IoT C#开发 5 - 操作 IoT 设备内嵌 SQLite 数据库 CURD

    Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,与以往的Windows版本不同,是为物联网设备专门设计的,硬件也不仅仅限于x86架构,同时可以在ARM架构上运行. 前几章我 ...

  4. 不需要写代码,文件夹右键cmd定位指定目录

    引子 这篇文章其实本来不是这样的,因为我用C#的代码实现了一个程序,后面才突然发现,我太傻太天真了,明明不需要写程序和写代码的,结果自己把自己二住了. 我们来看看效果图. 由于,我自己的原因,这个功能 ...

  5. 纯灌水Linus主义

    卖桃君重新整理了Linus的相关故事,在此摘选对自己有触动的内容. 关于生命的意义,李纳斯的解释是,有三件事具有生命的意义.它们是你生活当中所有事情的动机.第一是生存,第二是社会秩序,第三是娱乐.生活 ...

  6. RARP反向地址转换协议

    反向地址转换协议(RARP:Reverse Address Resolution Protocol) 反向地址转换协议(RARP)允许局域网的物理机器从网关服务器的 ARP 表或者缓存上请求其 IP ...

  7. 调优Java virtual machine常见问题汇总整理

    数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型.基本类型的变量保存原始值,即:他代表的值就是数值本身:而引用类型的变量保存引用值.“引用值”代表了某个对象的引用,而不是对象本身, ...

  8. Scalaz(43)- 总结 :FP就是实用的编程模式

    完成了对Free Monad这部分内容的学习了解后,心头豁然开朗,存在心里对FP的疑虑也一扫而光.之前也抱着跟大多数人一样的主观概念,认为FP只适合学术性探讨.缺乏实际应用.运行效率低,很难发展成现实 ...

  9. Scalaz(26)- Lens: 函数式不可变对象数据操作方式

    scala中的case class是一种特殊的对象:由编译器(compiler)自动生成字段的getter和setter.如下面的例子: case class City(name:String, pr ...

  10. 《Java4Android》视频学习笔记——为什么用抽象类?

    我们来举个例子,然后引出这个问题的答案: 市面上有 喷墨式打印机 和 针式打印机 这两种形式的打印机,我们需要编程来实现他们的 开机,关机以及打印. 构建父类Printer class Printer ...