两个不同类的通用基类?

时间:2014-03-21 21:52:36

标签: android inheritance multiple-inheritance listadapter

我试图实现自定义类型的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;
    }
}

1 个答案:

答案 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