我想扩展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");
}
}
}
}
}
mViewBinder
,mTo
和mFrom
是SimpleCursorAdpater的私有成员这一事实阻止我这样做。
有没有更好的方法来实现我的目标,而不是将SimpleCursorAdapter
批发来源复制到MyCursorView
并将我的条件添加到bindView
? (该解决方案将起作用,并且速度很快,但是不好的做法很糟糕。)
(在元级别上,看起来Android作者已经交换了扩展SimpleCursorAdapter的自由,因为他们可以自由地更改实现。是否有任何语言可以保留两者?)
答案 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()
将回退到默认值实施