2013-04-08 102 views
5

有沒有辦法獲得視圖充氣的佈局的資源ID(如R.layout.viewtoInflate)?獲取視圖充氣的資源ID

我想實現列表視圖,使用2個自定義佈局的列表項。使用哪個項目佈局基於用於填充列表視圖的對象中的字段。

我在自定義適配器中缺少的東西是一種知道我在getView()中獲得的'convertView'的資源膨脹的方法。如果我能得到這些信息,我可以比較並確定是否可以重新使用轉換視圖,或者如果必須將其替換爲當前項目的適當佈局。

因此,理想情況下是這樣的:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 

    JSONObject currItem = mItems.getJSONObject(position); 

    int layoutType; 

    if (currItem.getBoolean("alternate")) 
     layoutType = R.layout.list_item_b; 
    else 
     layoutType = R.layout.list_item_a; 

    if (convertView == null || <convertView.resourceID> != layoutType) { 
     convertView = inflater.inflate(layoutType, null); 

     //Finish setting up new View and its holder 
    } 
    else { 
     //Get view holder for view reuse 
    } 

    //populate view with the required content 

    return convertView; 
} 

在最壞的情況我能不能再利用的觀點,在所有和公正的膨脹,我需要每一次佈局,但它似乎很浪費。

回答

5

有一種官方的方式來使用多個佈局,只需覆蓋getViewTypeCount()getItemViewType()。這些方法通知適配器預期有多個佈局,並且convertView將始終是合適的佈局(因此不需要檢查資源ID。)有關示例代碼,請參閱this example

但是,如果你想找出哪個佈局是哪個,只需檢查一個獨特的特徵。例如,您可以在僅存在於一個佈局中的View上使用findViewById(),然後檢查它是否返回null

+0

我不明白我是如何錯過這種多佈局功能,但謝謝。另外,感謝您提供尋找佈局類型的建議,現在不再需要,但無論如何都很好。不過,對我來說,看起來很奇怪,沒有官方的方式來獲得充氣視圖的佈局。 – RobertoCuba 2013-04-09 18:10:02

3

列表視圖支持多種佈局 - 您需要返回getViewTypeCount()中使用的佈局的計數以及getItemViewType()中的行的正確佈局類型。

如果您還想知道它是從哪個佈局膨脹的,那麼您可以使用setTag()將任何信息附加到視圖中,稍後使用getTag()檢索它 - 它可以是您的layoutId或其他任何內容。

-1

如果您要求從已膨脹的佈局中獲取項目的ID。它是這樣的: -

//Suppose you have an TextView in the inflated layout of id textView1. Here you go 

convertView = inflater.inflate(layoutType, null); 
TextView tv = (TextView)convertview.findViewById(R.id.textView1); 
+0

上面的代碼如何返回充氣項目的ID。 findviewbyid只返回視圖而不是id – 2014-01-21 12:59:57

1

我要做的就是創建視圖時保存充氣視圖的資源ID在視圖持有人。這使我可以在填充視圖時獲取佈局資源ID。

希望這會有所幫助。