冬天渐渐来临

愿他

不要对我爱的冻手


先看一下BaseAdapter实现了哪些接口

详解BaseAdapter中getItem方法_java

其中ListAdapter又继承了Adapter接口.


Adapter接口就定义了我们常用的几个方法.

详解BaseAdapter中getItem方法_java_02

除getItem、getItemId、getView、getCount这4个方法以外的都被BaseAdapter重写了,所以只需要实现这四个就行,必要情况下,还需要重写其他方法.


其中.

getView()    返回所显示的view

getCount()     返回列表中的大小

都很好理解,通过改变getCount和getView的返回值,可以轻松看出效果.


来介绍一下这两个方法.


在官网是这么对他们说的.

getItem    获取与数据集中指定位置关联的数据项

getItemId    获取与列表中指定位置关联的行ID


源码跟踪一下


调用getItem的地方在AdapterView类的getSelectItem方法中.这只是其中之一.AdapterView便是所有适配器视图的老祖宗,ListView也是继承他

详解BaseAdapter中getItem方法_java_03

其中getAdapter是一个抽象方法,必须由子类去实现,也就是getAdapter要从AdapterView的子类中获得.ListView就是AdapterView的一个子类.


所以来看一下ListView源码中对adapter的实现

详解BaseAdapter中getItem方法_java_04

其中setAdapter便是对adapter赋值,也就是最终获取的是我们写的adapter,

详解BaseAdapter中getItem方法_java_05

之后调用getSelectedItemPosition获取选中Item的postion(位置),这个方法在ListView中是返回-1的,只有在Spinner中可以正常返回选中的位置.


但是,在setAdapter后,获取可以得到0,也就是默认选中了第一项

详解BaseAdapter中getItem方法_java_06


之后不管怎么调用,都会返回-1.代表没有任何item选中.


内部的getSelectedItemPosition方法直接返回mNextSelectedPosition变量,但是具体何时对mNextSelectedPosition赋值,我在没有研究过.


我想起以前按键手机通过上下去选择列表.或许可以把


如果给Spinner设置了setOnItemSelectedListener,可以得到getSelectedItemPosition的值

详解BaseAdapter中getItem方法_java_07


毕竟ListView不是用来做选择的,而Spinner才是.并且调用Spinner的setOnItemClickListenerInt方法会报错,毕竟Spinner也不是对item单机操作的

详解BaseAdapter中getItem方法_java_08

而且setOnClickListener方法两个控件都不可以使用.

详解BaseAdapter中getItem方法_java_09


还有个技巧要知道.

AdapterView<?> parent参数是ListView的父类.可以把parent强制转成ListView,对他进行操作.parent.getAdapter便是获取你的适配器.这两个是相等的

详解BaseAdapter中getItem方法_java_10


那getItem就可以直接返回null也是可以的.也并不是一定要list.get(postion)或者通过string[postion]去返回.


详解BaseAdapter中getItem方法_java_11

当然,这么做也是有原因的.

在ListView的getItemAtPosition方法中,返回值便是从你写的getItem中获取.

详解BaseAdapter中getItem方法_java_12

这其实也就是间接的从数组或者集合中获取.


需要用到ListView中指定Item位置数据的时候,可以直接从数组或者集合中获取.并不需要调用getItemAtPosition获取.