31

我总是在我的自定义类中使用ViewHolder模式。ArrayAdapter但是,在CursorAdapter方法getView()中并不是强制要求被覆盖,而是具有bindViewnewView方法。

我的问题是 - 是CursorAdapter通过内部实现ViewHolder模式来重用视图还是需要像我们通常在 custom 中那样进行编码ArrayAdapter?如果需要编码,正确的方法是什么?

更新

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

4

2 回答 2

40

我的问题是 - CursorAdapter 是通过内部实现 ViewHolder 模式来重用视图,还是需要像我们通常在自定义 ArrayAdapter 中那样进行编码?

我不确定你所说的ViewHolder模式是什么。如果您指的是有一个帮助类来缓存每次查找视图(并将其设置为 row 的标签View),那么答案是否定的。如果要实现此模式,您需要在方法中设置持有者(使用 查找行视图中的视图findViewById),newView然后将其设置为行视图的标记。然后在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方法实现了这种模式,您只需要实现newViewandbindView方法,您就可以保证获得一个被回收的视图(如果可能的话在那一刻)。

于 2012-10-12T14:13:22.143 回答
3

您还没有说明您使用的是平台版本还是支持库版本CursorAdapter。无论哪种情况,Android都是开源的,所以你可以自己寻找!

android.support.v4.widget.CursorAdapter
android.widget.CursorAdapter

如果您使用的是 Chrome,Android SDK 参考搜索组件非常有用!

于 2012-10-12T14:11:57.823 回答