convertview機(jī)制

布局文件

[html]view plaincopy

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical">

android:id="@+id/result"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:cacheColorHint="#00000000">

此處注意ListView的android:layout_height屬性值為"fill_paternt",如果為“wrap_content"將會是另一種情況

adapter的代碼ListViewAdapter.java

[java]view plaincopy

classListViewAdapterextendsBaseAdapter

{

privateContext?mContext;

inti=0;

publicListViewAdapter?(Context?context)

{

this.mContext=context;

}

@Override

publicintgetCount()

{

return30;

}

@Override

publicObject?getItem(intposition)

{

??returnposition;

}

@Override

publiclonggetItemId(intposition)

{

??return0;

}

publicView?getView(intposition,?View?convertView,?ViewGroup?parent)

{

??System.out.println("getView?"+?position?+"?"+?convertView);//調(diào)試語句

???Holder?holder;

if(null==convertView)

{

holder=newHolder();

convertView=LayoutInflater.from(mContext).inflate(R.layout.textview,null);//mContext指的是調(diào)用的Activtty

holder.textView=(TextView)convertView.findViewById(R.id.textview);

convertView.setTag(holder);

}

else

{

holder=(Holder)convertView.getTag();

}

holder.textView.setText("position:?"+position);

returnconvertView;

}

classHolder

{

publicTextView?textView;

}

}

運(yùn)行程序之后發(fā)現(xiàn)屏幕上顯示出的Item的convertview都為空,向下滑動新產(chǎn)生的Item的convetview都不為空。到此為止和上面鏈接中講的是一致的,但是如果設(shè)置ListView的android:layout_height屬性值為“wrap_content

之后,發(fā)現(xiàn)只有第一個Item的convertview為null其他的不為空。

雖然兩種設(shè)置不同,結(jié)果也不同,但是convertview的機(jī)制沒有變。

其實(shí)到此為止我們可以總結(jié)出convertview的機(jī)制了,就是在初始顯示的時候,每次顯示一個item都調(diào)用一次getview方法但是每次調(diào)用的時候covertview為空(因?yàn)檫€沒有舊的view),當(dāng)顯示完了之后。如果屏幕移動了之后,并且導(dǎo)致有些Item(也可以說是view)跑到屏幕外面,此時如果還有新的item需要產(chǎn)生,則這些item顯示時調(diào)用的getview方法中的convertview參數(shù)就不是null,而是那些移出屏幕的view(舊view),我們所要做的就是將需要顯示的item填充到這些回收的view(舊view)中去,最后注意convertview為null的不僅僅是初始顯示的那些item,還有一些是已經(jīng)開始移入屏幕但是還沒有view被回收的那些item。

最終我們用親手寫的代碼實(shí)現(xiàn)了Recycler(反復(fù)循環(huán)器).

第二個問題其實(shí)應(yīng)該在第一個問題中嵌套來講,但是為了思路清晰我分開了:

view的setTag和getTag方法其實(shí)很簡單,在實(shí)際編寫代碼的時候一個view不僅僅是為了顯示一些字符串、圖片,有時我們還需要他們攜帶一些其他的數(shù)據(jù)以便我們對該view的識別或者其他操作。于是android 的設(shè)計(jì)者們就創(chuàng)造了setTag(Object)方法來存放一些數(shù)據(jù)和view綁定,我們可以理解為這個是view 的標(biāo)簽也可以理解為view 作為一個容器存放了一些數(shù)據(jù)。而這些數(shù)據(jù)我們也可以通過getTag() 方法來取出來。

到這里setTag和getTag大家應(yīng)該已經(jīng)明白了。再回到上面的話題,我們通過convertview的setTag方法和getTag方法來將我們要顯示的數(shù)據(jù)來綁定在convertview上。如果convertview 是第一次展示我們就創(chuàng)建新的Holder對象與之綁定,并在最后通過return convertview 返回,去顯示;如果convertview 是回收來的那么我們就不必創(chuàng)建新的holder對象,只需要把原來的綁定的holder取出加上新的數(shù)據(jù)就行了。

holder就是和convertView關(guān)聯(lián)的內(nèi)容

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容