Android - 是否在CursorAdapter中自动实现了ViewHolder模式?

Mah*_*iya 31 database android android-cursoradapter

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

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

更新

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

Luk*_*rog 40

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

我不确定你用这种ViewHolder模式来表达什么.如果你指的是每次都有一个helper类来缓存查找视图(并将其设置为行的标记View),那么答案就是否定.如果要实现此模式,则需要在方法中设置holder(在行视图中查找视图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;
    }
// ...
Run Code Online (Sandbox Code Playgroud)

如果你指的convertView是被重用(比如在非Cursor基础的适配器中),那么答案是肯定的,该getView方法实现了这种模式,你只需要实现newViewbindView方法,你就可以得到一个被回收的视图(如果可能的话)那一刻).