2012-04-12 420 views

回答

103

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如何重用。在適配器

+4

Convertview == null當所有itens遵循相同的佈局時都是有用的。例如,當您需要檢查收音機或選中的按鈕時,並根據每個項目更改佈局時,您需要重新填充或獲取緩存視圖。 – sagits 2015-04-16 14:30:41

+0

不需要過度充氣。只需要在getview中寫入switch或if-else梯形圖並根據您的情況充氣視圖,重寫public int getItemViewType(int position)和public int getViewTypeCount()。 @sagits – 2015-05-08 06:36:00

+0

如果語句通常有效,但是使用單選按鈕,編輯文本以及使用緩存視圖時遇到麻煩的這些內容,有關於堆棧溢出的一些問題。 – sagits 2015-05-08 17:13:55

9

你可以看看這個視頻關於列表視圖。它來自去年的Google IO,並且仍然是我心目中最好的列表視圖。

http://www.youtube.com/watch?v=wDBM6wVEO70

  1. 它膨脹(您RES /佈局/文件夾中的XML文件)的佈局爲Java對象如的LinearLayout和其他視圖。

  2. 看看視頻,會及時瞭解轉換視圖的使用情況,基本上它是一個等待您重複使用的回收視圖,以避免創建新對象並放慢您的滾動名單。

  3. 允許您從適配器引用列表視圖。

4
  1. 佈局充氣膨脹/添加外部XML定義當前視圖。

  2. getView()被調用多次,包括滾動時。因此,如果它已經有觀點誇大了,我們不想再做一次,因爲膨脹是一個昂貴的過程..這就是爲什麼我們檢查它是否爲空,然後膨脹它。

  3. 父視圖是您的列表的單細胞..

+3

父視圖在這裏解釋不正確。它將是ListView而不是ListItem – 2014-11-29 09:09:51

2

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; 
    } 

} 
1

getView()方法來創建新的ViewViewGroupListview或微調每一行。您可以在res/layout文件夾中定義此ViewViewGroup文件中的Layout XML文件,並可以將其引用到Adapter類Object。

如果在傳遞給適配器的數組中有4個項目。getView()方法將爲4行Adaper創建4個視圖。

LayoutInflater類有一個方法inflate(),它從XML資源佈局創建視圖對象。

61

getView()方法是用於產生的ListViewGallery項的視圖,...

  1. LayoutInflater用於獲取您在佈局XML(根對象定義視圖對象,通常是LinearLayoutFrameLayout,或RelativeLayout

  2. convertView是用於回收。假設您有一次只能顯示10個項目的列表視圖,並且當前顯示項目1 - >項目10的當前顯示爲 。當您向下滾動一個項目時,項目1的項目1將不在屏幕上,項目11將會被顯示。爲 生成項目11的視圖,將調用getView()方法,並且 convertView這裏是項目1的視圖(不再需要 )。因此,請爲項目11創建一個新的查看對象(這是昂貴的 ),爲什麼不重新使用convertView? =>我們只檢查convertView是否爲 爲空,如果爲null則創建新視圖,否則重新使用convertView

  3. parentView是包含項目的視圖,其中getView()生成的視圖。通常它是ListView控件或畫廊...

注意:你不直接調用此方法,只需要實現它來告訴父視圖如何生成項目的看法。

+2

對於parentView的優秀解釋,找不到比這個更好的解釋,+1 – 2013-12-17 10:27:56

+0

驚人的解釋! – gabi 2015-09-19 14:22:46

+0

很好的解釋+1 – tpk 2016-09-21 17:01:30

5

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。

希望這有助於:)

0

您也可以找到有關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); 
相關問題