如何扩展Android的SimpleCursorAdapter?

时间:2013-10-02 13:20:49

标签: android simplecursoradapter

我想扩展SimpleCursorAdapter,向} else if (c instanceof MyView) { setMyViewMyThing(MyView v, text)方法添加bindView

public void bindView(View view, Context context, Cursor cursor) {
    final ViewBinder binder = mViewBinder;
    final int count = mTo.length;
    final int[] from = mFrom;
    final int[] to = mTo;

    for (int i = 0; i < count; i++) {
        final View v = view.findViewById(to[i]);
        if (v != null) {
            boolean bound = false;
            if (binder != null) {
                bound = binder.setViewValue(v, cursor, from[i]);
            }

            if (!bound) {
                String text = cursor.getString(from[i]);
                if (text == null) {
                    text = "";
                }

                if (v instanceof TextView) {
                    setViewText((TextView) v, text);
                } else if (v instanceof ImageView) {
                    setViewImage((ImageView) v, text);
                } else {
                    throw new IllegalStateException(v.getClass().getName() + " is not a " +
                            " view that can be bounds by this SimpleCursorAdapter");
                }
            }
        }
    }
}

mViewBindermTomFrom是SimpleCursorAdpater的私有成员这一事实阻止我这样做。

有没有更好的方法来实现我的目标,而不是将SimpleCursorAdapter批发来源复制到MyCursorView并将我的条件添加到bindView? (该解决方案将起作用,并且速度很快,但是不好的做法很糟糕。)

(在元级别上,看起来Android作者已经交换了扩展SimpleCursorAdapter的自由,因为他们可以自由地更改实现。是否有任何语言可以保留两者?)

2 个答案:

答案 0 :(得分:3)

  

如何扩展Android的SimpleCursorView?

Android中没有SimpleCursorView。对于本答复的其余部分,我将假设您指的是to SimpleCursorAdapter

  

我想扩展SimpleCursorView,在bindView方法中添加一个} else if(c instanceof MyView){setMyViewMyThing(MyView v,text)。

其他人将use setViewBinder()提供their own ViewBinder。引用ViewBinder的文档:

  

您应该使用此类将Cursor中的值绑定到SimpleCursorAdapter不直接支持的视图,或者更改SimpleCursorAdapter支持的视图的绑定方式。

当然,你不必这样做。

  

有没有更好的方法来实现我的目标,而不是将SimpleCursorView批发源复制到MyCursorView并将我的条件添加到bindView?

除了使用ViewBinder之外?可能不是。

  

在元级别上,看起来Android作者已经交换了扩展SimpleCursorView的自由,因为他们可以自由地更改实现。

“在元级别”,它看起来像Android作者favored composition over inheritance

答案 1 :(得分:1)

使用SimpleCursorAdapter.ViewBinder,您尝试实现的目标应该是可行的。如果false不是setViewValue(View view, Cursor cursor, int columnIndex)的实例,请执行其中之一,并在view函数中返回MyView。然后,调用SimpleCursorAdapter.setViewBinder(SimpleCursorAdapter.ViewBinder viewBinder),将ViewBinder作为参数传递。根据文档(以及您发布的实现),如果ViewBinder无法处理View类型(即它返回false),bindView()将回退到默认值实施