我试图实现自定义类型的ListAdapter。底层数据可以来自数据库或其他类型的数据源,这意味着我应该扩展BaseAdapter。但是,我还想使用SimpleCursorAdapter和SimpleAdapter中实现的现有逻辑。
我猜其中一种方式就是我希望"注入" BaseAdapter与它的后代之间的新课......
基本上我想要实现的就是这个图,只是为了说明探测。
以下是我提出的一个可能的解决方案,但我很好奇这样做的标准方式是什么?
public class ExpandableAdapterHelper{
public void onNewView(View view, long id) {
// Do stuff
}
public void onBindView(View view, long id) {
// Do stuff
}
}
public class ExpandableCursorAdapter extends SimpleCursorAdapter{
private ExpandableAdapterHelper expandableAdapterHelper;
public ExpandableCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int flags) {
super( context, layout, c, from, to, flags );
expandableAdapterHelper = new ExpandableAdapterHelper();
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
View newItem = super.newView(context, cursor, parent);
expandableAdapterHelper.onNewView(newItem, cursor.getInt(0));
return newItem;
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
super.bindView(view, context, cursor);
expandableAdapterHelper.onBindView(view, cursor.getInt(0));
}
}
public class ExpandableSimpleAdapter extends SimpleAdapter{
private ExpandableAdapterHelper expandableAdapterHelper;
public ExpandableSimpleAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to){
super( context, data, resource, from, to );
expandableAdapterHelper = new ExpandableAdapterHelper();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if( convertView == null ){
expandableAdapterHelper.onNewView(convertView, getItemId(position));
}
else{
expandableAdapterHelper.onBindView(convertView, getItemId(position));
}
return convertView;
}
}
答案 0 :(得分:0)
以下是您的3个选项:1-根据数据动态选择适配器类型,2-将数据从一种类型转换为另一种类型3-实现读取多种数据类型的适配器。
选项1,动态选择适配器。 - 听起来像最简单的解决方案,除非有什么阻止你这样做 - 比如必须同时显示来自2个来源的数据。
选项2,转换数据。 - 也很好的解决方案。将光标读入列表或映射imo很容易,然后只需实现一个读取映射数据的适配器。 @Luksprog还提供了一个选项2解决方案 - 它将为simpleCursorAdapter提供一个包含其他数据的MatrixCursor。但无论哪种方式,您都可以将数据转换为统一类型。
选项3,教adaper读取多种数据类型。 - 这更复杂,但似乎是&#34;答案&#34;您的问题框架为教您的适配器读取多种数据类型。为此,simpleCursorAdapter似乎不是我的解决方案,因为它不能让你控制视图 - 它通过匹配资源ID在内部将光标列绑定到视图元素。因此,教授如何阅读非光标数据是一个糟糕的选择。如果你走这条路,我认为唯一的选择是非游标适配器,比如baseAdapter。
但同样,溶液1-2是优选的。如果您需要选项3,那么我将使用baseAdapter