冬天渐渐来临
愿他
不要对我爱的冻手冻脚
先看一下BaseAdapter实现了哪些接口
其中ListAdapter又继承了Adapter接口.
Adapter接口就定义了我们常用的几个方法.
除getItem、getItemId、getView、getCount这4个方法以外的都被BaseAdapter重写了,所以只需要实现这四个就行,必要情况下,还需要重写其他方法.
其中.
getView() 返回所显示的view
getCount() 返回列表中的大小
都很好理解,通过改变getCount和getView的返回值,可以轻松看出效果.
来介绍一下这两个方法.
在官网是这么对他们说的.
getItem 获取与数据集中指定位置关联的数据项
getItemId 获取与列表中指定位置关联的行ID
源码跟踪一下
调用getItem的地方在AdapterView类的getSelectItem方法中.这只是其中之一.AdapterView便是所有适配器视图的老祖宗,ListView也是继承他
其中getAdapter是一个抽象方法,必须由子类去实现,也就是getAdapter要从AdapterView的子类中获得.ListView就是AdapterView的一个子类.
所以来看一下ListView源码中对adapter的实现
其中setAdapter便是对adapter赋值,也就是最终获取的是我们写的adapter,
之后调用getSelectedItemPosition获取选中Item的postion(位置),这个方法在ListView中是返回-1的,只有在Spinner中可以正常返回选中的位置.
但是,在setAdapter后,获取可以得到0,也就是默认选中了第一项
之后不管怎么调用,都会返回-1.代表没有任何item选中.
内部的getSelectedItemPosition方法直接返回mNextSelectedPosition变量,但是具体何时对mNextSelectedPosition赋值,我在没有研究过.
我想起以前按键手机通过上下去选择列表.或许可以把
如果给Spinner设置了setOnItemSelectedListener,可以得到getSelectedItemPosition的值
毕竟ListView不是用来做选择的,而Spinner才是.并且调用Spinner的setOnItemClickListenerInt方法会报错,毕竟Spinner也不是对item单机操作的
而且setOnClickListener方法两个控件都不可以使用.
还有个技巧要知道.
AdapterView<?> parent参数是ListView的父类.可以把parent强制转成ListView,对他进行操作.parent.getAdapter便是获取你的适配器.这两个是相等的
那getItem就可以直接返回null也是可以的.也并不是一定要list.get(postion)或者通过string[postion]去返回.
当然,这么做也是有原因的.
在ListView的getItemAtPosition方法中,返回值便是从你写的getItem中获取.
这其实也就是间接的从数组或者集合中获取.
需要用到ListView中指定Item位置数据的时候,可以直接从数组或者集合中获取.并不需要调用getItemAtPosition获取.