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

31

我总是在自定义的ArrayAdapter类中使用ViewHolder模式。然而,在CursorAdapter中,getView()方法不是必须重写的,但是有bindViewnewView方法。

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

更新

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

2个回答

40
我的问题是,CursorAdapter是否通过内部实现ViewHolder模式来重复使用视图,还是需要像我们通常在自定义ArrayAdapter中所做的那样编码?
我不确定你所说的ViewHolder模式是指什么。如果你指的是使用一个辅助类来缓存查找视图(并将其设置为行View的标记),那么答案是否定的。如果你想实现这个模式,你需要在newView方法中设置holder(使用findViewById查找行视图中的视图),然后将其作为行视图的标记。然后在bindView方法中,你可以调用getTag,检索holder并使用它。这是一个例子:
// 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方法,就可以确保获得一个已经被回收(如果在该时刻有可能)的视图。

@Mahendra,所以这是第一个情况。不,CursorAdapter(来自SDK或兼容包)中没有实现持有者模式。 - user
我的问题更多地涉及于“在自定义适配器中编写Holder是否必要”?我看到CursorAdapter类也有getView方法。 - Mahendra Liya
@Mahendra 实现 holder 是由你来完成的。你会得到一些性能提升,但并不像使用 convertView 那么明显。我已经在我的答案中编辑了一个小例子。 - user

3

我更新了我的问题... 我正在使用支持库版本。 - Mahendra Liya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接