布局文件
[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)容