2013-05-02 68 views
0

我有一個CursorAdapter與newView()和bindView()覆蓋。問題是bindView()沒有正確映射到由newView()創建的視圖。CursorAdapter bindView()沒有正確映射到從newView返回的視圖()

newView()返回根據遊標值從不同佈局膨脹的兩個不同視圖,如下所示。

@Override 
public View newView(Context context, Cursor cursor, ViewGroup parent){ 
    View view = null; 
    int who = //... get a value from cursor 

    switch(who){ 
    case 0: 
     view = LayoutInflater.from(context).inflate(R.layout.first, null); 
     view.setTag("case 0"); // for bindView() mapping inspection 
     break; 
    case 1: 
     view = LayoutInflater.from(context).inflater(R.layout.second, null); 
     view.setTag("case 1"); // for bindView() mapping inspection 
     break; 
    default: 
     break; 
    } 
    return view; 
} 

然後,bindView()就像平常一樣。從遊標獲取值並將值設置爲從newView()返回的視圖中的UI元素。沒什麼特別的。我在newView()中放置了一個顯示視圖標記集的bindView()日誌。日誌顯示bindView()在調用時不會獲得所需的視圖。

我認爲,當bindView()被調用時,它綁定到現有的視圖,如果有任何內存效率。所以我認爲bindView會獲得一個可能由row _ID標識的特定視圖。但它似乎在被調用時,它只能獲得任何現有的視圖。

如何讓bindView在視圖可以有不同的佈局時獲取具有特定佈局的指定視圖?

回答

3

默認情況下,ListView中的所有項都被視爲相同的視圖類型。您可以覆蓋getItemViewType以根據位置返回不同的值。然後視圖將僅用於相同的項目視圖類型。

您還想覆蓋getViewTypeCount,否則getItemViewType將不起作用。

+0

謝謝你的建議。我認爲這是解決問題的方法。我有另一個問題。 getItemViewType何時調用與newView有關? – seongjoo 2013-05-02 05:00:24

+0

@seongjoo - 在任何視圖被誇大之前調用'getItemViewType'。流程是'getItemViewType'(確定是否將一個非空的'convertView'傳遞給'getView') - >'getView' - >(如果'convertView == null' then'newView') - >'bindView' – ianhanniballake 2013-05-02 05:22:50

+0

'覆蓋getViewTypeCount'解決了我花了2個小時的問題 – 2016-10-16 09:38:37