2012-10-12 27 views
30

我在我的自定義ArrayAdapter類中始終使用ViewHolder模式。但是,在CursorAdapter中,getView()方法不是強制要求被覆蓋,而是具有bindViewnewView方法。Android - ViewHolder模式是否在CursorAdapter中自動實現?

我的問題是 - 是否CursorAdapter通過內部實現ViewHolder模式重新使用視圖,或者它需要按照我們通常在自定義ArrayAdapter中進行編碼?如果需要編碼,那麼執行該操作的正確方法是什麼?

更新

我使用android.support.v4.widget.CursorAdapter

回答

39

我的問題是 - 做的CursorAdapter重新使用由內部 實施ViewHolder圖案或需要被編碼爲我們 通常在定製ArrayAdapter做到這一點的看法?

我不確定你在ViewHolder模式下是指什麼。如果你指的是有一個幫助類緩存每次查找視圖(並將其設置爲行View的標記),那麼答案是否定的。如果你想實現這種模式,你需要在newView方法中設置持有者(在findViewById的行視圖中查看視圖),然後將其設置爲行視圖的標記。然後在bindView方法中,您可以撥打getTag,檢索持有人並使用它。舉個例子:

// custom CursorAdapter ... 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     View rowView = ((LayoutInflater) context 
       .getSystemService("layout_inflater")).inflate(
       R.layout.row_layout, parent, false); 
     ViewHolder holder = new ViewHolder(); 
     holder.v1 = rowView.findViewById(R.id.v1); 
     holder.v2 = rowView.findViewById(R.id.v2); 
     rowView.setTag(holder); 
     return rowView; 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 
     ViewHolder holder = (ViewHolder) view.getTag(); 
     // use the holder filled with views 
     // hlder.v1.setSomething 
    } 

    class ViewHolder { 
     View v1, v2; 
    } 
// ... 

如果你指的是convertView(非Cursor基於適配器等)被重用,那麼答案是肯定的,getView方法實現了這個模式,你只需要實現newViewbindView方法並保證您可以獲得回收的視圖(如果可能的話)。

+0

'ViewHolder'我的意思是'Holder'模式... –

+0

@Mahendra所以這是第一個案例。不,持有者模式不在'CursorAdapter'中實現(來自SDK或兼容性包)。 – Luksprog

+0

我的查詢是關於'在自定義適配器中編寫'Holder'還是不需要'?我看到'CursorAdapter'類也有'getView'方法.. –

相關問題