Android Adapter的几个常用方法
AndroidAdapter的几个常用方法分享给大家,具体内容如下
1 ListView是在什么时候设置对Adapter的数据监听的?
在setAdapter(ListAdapteradapter)中,会先取消ListView中原来的mAdapter中的数据监听(mAdapter.unregisterDataSetObserver(mDataSetObserver);),然后再设置对新设置的adapter的数据监听。
2 getView(intposition,ViewconvertView,ViewGroupparent)
我们都知道mAdapter的getView方法很重要,那么该方法在ListView是怎么被利用的呢?在ListView的源码中没有发现getView方法的调用,于是我们去ListView的父类AbsListView。在AbsListView中的obtainView中调用了getView,其主要代码逻辑部分为:
ViewobtainView(intposition,boolean[]isScrap){
isScrap[0]=false;
ViewscrapView;
//从回收器中获取view
scrapView=mRecycler.getScrapView(position);
Viewchild;
if(scrapView!=null){
...
//若不为空,则传入convertView,这样的话重用了view,同时更新了数据
child=mAdapter.getView(position,scrapView,this);
...
}else{
//若为空,则在getView中重新创建HolderView,且填入数据
child=mAdapter.getView(position,null,this);
...
}
returnchild;
}
而obtainView又会在ListView的measure以及生成整个ListView等中用到。
对于重写getView方法最终要的应该就是要记得convertView的重用了,没有重用几乎都会造成内存卸了。
3 getCount()
Adapter的getCount()用来干啥? 在ListView中,在onMeasure以及触控分发响应等过程中都会用到Adapter的getCount()函数。毫无疑问的是:它应该返回底层数据的数据个数。
4 getItem(intposition)
getItem()在AdapterView中被调用,然后供用户调用:从这两个函数的描述我们可以看出,我们应该在Adapter的getItem()方法中返回position对应的数据,但是不是说一定要返回用于在Item的View上展示的数据,这个还是看需求,虽然可能大部分情况都是返回View中展示的数据。
/**
*Getsthedataassociatedwiththespecifiedpositioninthelist.
*
*@parampositionWhichdatatoget
*@returnThedataassociatedwiththespecifiedpositioninthelist
*/
publicObjectgetItemAtPosition(intposition){
Tadapter=getAdapter();
return(adapter==null||position<0)?null:adapter.getItem(position);
}
/**
*@returnThedatacorrespondingtothecurrentlyselecteditem,or
*nullifthereisnothingselected.
*/
publicObjectgetSelectedItem(){
Tadapter=getAdapter();
intselection=getSelectedItemPosition();
if(adapter!=null&&adapter.getCount()>0&&selection>=0){
returnadapter.getItem(selection);
}else{
returnnull;
}
}
纵观整个结构,可以说存在这样的三层:dataLists(原底层数据)--Adapter--AdapterView,有了getItem()方法的存在,我们可以直接利用Adapter来获取数据,而不需要获取底层dataLists的引用;有了getItemAtPosition()方法的存在,我们可以直接利用AdapterView获取底层数据,而不需要获取其Adapter的引用。这样的话,对于编程的简便性以及解耦性都好很多。
5 getItemId(intposition)
在AdapterView中发现它的一些调用,
publiclonggetItemIdAtPosition(intposition){
Tadapter=getAdapter();
return(adapter==null||position<0)?INVALID_ROW_ID:adapter.getItemId(position);
}
privatevoidfireOnSelected(){
if(mOnItemSelectedListener==null)
return;
intselection=this.getSelectedItemPosition();
if(selection>=0){
Viewv=getSelectedView();
//这里调用的getItemId得到的返回值与selection都属于同一个item的特征,其意义也就在于在选择接口的onItemSelected方法中可
//以直接拿到该item的id,而不需要通过获取adapter来间接实现
mOnItemSelectedListener.onItemSelected(this,v,selection,
getAdapter().getItemId(selection));
}else{
mOnItemSelectedListener.onNothingSelected(this);
}
}
intfindSyncPosition(){
...
rowId=adapter.getItemId(seed);
if(rowId==idToMatch){//从这里来看,getItemId似乎应该对于不同的item返回不同的值,保持唯一性
//Foundit!
returnseed;
}
...
}
与上面分析的getItem()方法一样,getItemId()和getItemIdAtPosition()都提供了编程上面的便利。但是目前来看,由于对id没啥需求,所以大部分在重写getItemId方法时都是直接返回的position值,这样做也是对的,虽然从数据获取上没啥意义(我给你一个position,你原封不动的返回给我,啥意思)。但是我想说明的是,不要被这个做法所限制,而以为ItemId就是item在数据中的position。其实若有需求,可以利用getItemId()方法返回一些其他的值,比如每个item数据在数据库中id值,或者每个人的身份证号等。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。