我的問題是:創建自己的自定義適配器時,getView()方法如何工作?
- 什麼是LayoutInflater的功能?
- 爲什麼我讀過的所有文章檢查convertview是否爲null?它是什麼意思,當它是空的,它不是什麼意思?
- 此方法接受的父參數是什麼?
我的問題是:創建自己的自定義適配器時,getView()方法如何工作?
1:該LayoutInflater
需要您的佈局XML文件並從其內容創建不同的視圖對象。
2:適配器構建爲重用視圖,當視圖滾動以便不再可見時,它可用於出現的新視圖之一。這個重用的視圖是convertView
。如果這是空的,這意味着沒有循環查看,我們必須創建一個新的,否則我們應該使用它來避免創建一個新的。
3:提供了parent
,因此您可以將您的視圖膨脹爲適當的佈局參數。
所有這些一起可以用來有效地創建將出現在列表中(即需要一個適配器或其他視圖)的觀點:
public View getView (int position, View convertView, ViewGroup parent){
if(convertView == null){
//We must create a View:
convertView = inflater.inflate(R.layout.my_list_item, parent, false);
}
//Here we can do changes to the convertView, such as set a text on a TextView
//or an image on an ImageView.
return convertView;
}
注意使用LayoutInflater
,即parent
可以使用作爲它的參數,以及convertView
如何重用。在適配器
你可以看看這個視頻關於列表視圖。它來自去年的Google IO,並且仍然是我心目中最好的列表視圖。
http://www.youtube.com/watch?v=wDBM6wVEO70
它膨脹(您RES /佈局/文件夾中的XML文件)的佈局爲Java對象如的LinearLayout和其他視圖。
看看視頻,會及時瞭解轉換視圖的使用情況,基本上它是一個等待您重複使用的回收視圖,以避免創建新對象並放慢您的滾動名單。
允許您從適配器引用列表視圖。
佈局充氣膨脹/添加外部XML定義當前視圖。
getView()被調用多次,包括滾動時。因此,如果它已經有觀點誇大了,我們不想再做一次,因爲膨脹是一個昂貴的過程..這就是爲什麼我們檢查它是否爲空,然後膨脹它。
父視圖是您的列表的單細胞..
父視圖在這裏解釋不正確。它將是ListView而不是ListItem – 2014-11-29 09:09:51
LayoutInflater
用於產生用於ListView
項目或在片段的onCreateView
的XML的動態視圖。
ConvertView
基本上用於回收當前不在視圖中的視圖。假設你有一個可滾動的ListView
。在向下滾動或向上滾動時,convertView
會顯示滾動的視圖。這種重複使用可以節省內存。
getView()
方法的父參數給出了具有listView的父佈局的引用。假設你想在父XML的任何項目,你可以使用的Id:
ViewParent nv = parent.getParent();
while (nv != null) {
if (View.class.isInstance(nv)) {
final View button = ((View) nv).findViewById(R.id.remove);
if (button != null) {
// FOUND IT!
// do something, then break;
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Log.d("Remove", "Remove clicked");
((Button) button).setText("Hi");
}
});
}
break;
}
}
getView()
方法來創建新的View
或ViewGroup
爲Listview
或微調每一行。您可以在res/layout
文件夾中定義此View
或ViewGroup
文件中的Layout XML
文件,並可以將其引用到Adapter
類Object。
如果在傳遞給適配器的數組中有4個項目。getView()
方法將爲4行Adaper創建4個視圖。
LayoutInflater類有一個方法inflate(),它從XML資源佈局創建視圖對象。
getView()
方法是用於產生的ListView
,Gallery
項的視圖,...
LayoutInflater
用於獲取您在佈局XML(根對象定義視圖對象,通常是LinearLayout
, FrameLayout
,或RelativeLayout
)
convertView
是用於回收。假設您有一次只能顯示10個項目的列表視圖,並且當前顯示項目1 - >項目10的當前顯示爲 。當您向下滾動一個項目時,項目1的項目1將不在屏幕上,項目11將會被顯示。爲 生成項目11的視圖,將調用getView()方法,並且 convertView
這裏是項目1的視圖(不再需要 )。因此,請爲項目11創建一個新的查看對象(這是昂貴的 ),爲什麼不重新使用convertView
? =>我們只檢查convertView
是否爲 爲空,如果爲null則創建新視圖,否則重新使用convertView
。
parentView
是包含項目的視圖,其中getView()
生成的視圖。通常它是ListView控件或畫廊...
注意:你不直接調用此方法,只需要實現它來告訴父視圖如何生成項目的看法。
LayoutInflater的功能究竟是什麼?
當您使用XML進行設計時,您的所有UI元素都是標籤和參數。在使用這些UI元素(例如TextView或LinearLayout)之前,您需要創建與這些xml元素對應的實際對象。這是充氣器的用途。充氣器使用這些標籤及其相應參數來創建實際對象並設置所有參數。在此之後,您可以使用findViewById()獲取對UI元素的引用。
爲什麼我讀過的所有文章都檢查convertview是否爲null?它是什麼意思,當它是空的,它不是什麼意思?
這是一個有趣的。您會看到,每次繪製列表中的某個項目時,都會調用getView()。現在,在繪製項目之前,必須先創建項目。現在convertView基本上是最後一次使用的視圖來繪製一個項目。在getView()中,首先膨脹xml,然後使用findByViewID()獲取listitem的各種UI元素。當我們檢查(convertView == null)時,我們所做的是檢查視圖是否爲空(對於第一項),然後創建它,否則,如果它已經存在,重用它,不需要再次通過充氣過程。使其效率更高。
您還必須在getView()中遇到ViewHolder的概念。這使得列表更有效率。我們所做的是創建一個視圖,並存儲對我們在充氣後獲得的所有UI元素的引用。這樣,我們可以避免調用大量的findByViewId()並節省很多時間。此ViewHolder是在(convertView == null)條件中創建的,並使用setTag()存儲在convertView中。在else循環中,我們只是使用getView()獲取並重用它。
此方法接受的父參數是什麼?
父代是您的視圖通過getView()創建的ViewGroup最終附加的。現在在你的情況下,這將是ListView。
希望這有助於:)
您也可以找到有關getView在Adapter.java文件適配器接口有用的信息。 它說;
/**
* Get a View that displays the data at the specified position in the data set. You can either
* create a View manually or inflate it from an XML layout file. When the View is inflated, the
* parent View (GridView, ListView...) will apply default layout parameters unless you use
* {@link android.view.LayoutInflater#inflate(int, android.view.ViewGroup, boolean)}
* to specify a root view and to prevent attachment to the root.
*
* @param position The position of the item within the adapter's data set of the item whose view
* we want.
* @param convertView The old view to reuse, if possible. Note: You should check that this view
* is non-null and of an appropriate type before using. If it is not possible to convert
* this view to display the correct data, this method can create a new view.
* Heterogeneous lists can specify their number of view types, so that this View is
* always of the right type (see {@link #getViewTypeCount()} and
* {@link #getItemViewType(int)}).
* @param parent The parent that this view will eventually be attached to
* @return A View corresponding to the data at the specified position.
*/
View getView(int position, View convertView, ViewGroup parent);
Convertview == null當所有itens遵循相同的佈局時都是有用的。例如,當您需要檢查收音機或選中的按鈕時,並根據每個項目更改佈局時,您需要重新填充或獲取緩存視圖。 – sagits 2015-04-16 14:30:41
不需要過度充氣。只需要在getview中寫入switch或if-else梯形圖並根據您的情況充氣視圖,重寫public int getItemViewType(int position)和public int getViewTypeCount()。 @sagits – 2015-05-08 06:36:00
如果語句通常有效,但是使用單選按鈕,編輯文本以及使用緩存視圖時遇到麻煩的這些內容,有關於堆棧溢出的一些問題。 – sagits 2015-05-08 17:13:55