【问题标题】:Common base class for two different classes?两个不同类的通用基类?
【发布时间】:2014-03-21 21:52:35
【问题描述】:

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

【问题讨论】:

  • 使用SimpleCursorAdapter。默认情况下它将处理Cursor,如果您有任何其他类型的数据而不是将其转换为MatrixCursor(应该相当简单)然后将其传递给适配器。这可能是最简单的解决方案。
  • 谢谢!我不知道 MatrixCursor,但这绝对是要走的路。特别是因为我现有的解决方案是基于 SimpleCursorAdapter 的(以一种骇人听闻的方式 - 我使用 SQLite 数据库作为数据和我的适配器之间的一种代理......非常丑陋:) 这应该使它更有效率和干净!

标签: android inheritance multiple-inheritance listadapter


【解决方案1】:

这里有 3 个选项:1- 根据数据动态选择适配器类型,2- 将数据从一种类型转换为另一种类型 3- 实现读取多种数据类型的适配器。

选项 1,动态选择适配器。 - 听起来是最简单的解决方案,除非有什么阻碍您这样做——比如必须同时显示来自 2 个来源的数据。

选项2,转换数据。 - 也是很好的解决方案。将光标读入列表或映射 imo 很容易,然后只需实现一个读取映射数据的适配器。 @Luksprog 还提出了一个选项 2 解决方案 - 而是为 simpleCursorAdapter 提供一个包含其他数据的 MatrixCursor。但无论哪种方式,您都将数据转换为统一类型。

选项 3,教 adaper 读取多种数据类型。 - 这更复杂,但似乎是您的问题的“答案”,即教您的适配器读取多种数据类型。为此,simpleCursorAdapter 对我来说似乎不是一个解决方案,因为它不能让您控制视图——它通过匹配资源 ID 在内部将光标列绑定到视图元素。因此,对于教授如何读取非光标数据来说,这是一个糟糕的选择。如果你走这条路,我认为唯一的选择是非游标适配器,比如 baseAdapter。

但同样,解决方案 1-2 更可取。如果您需要选项 3,那么我会使用 baseAdapter

【讨论】:

  • 但是我想使用 SimpleCursorAdapter 中已经实现的所有现有逻辑来处理游标,并使用 SimpleAdapter 来处理静态数据源。否则我将不得不“重新发明轮子”,对吧?我的意思是,如果您建议扩展 BaseAdapter?
  • 谢谢!我不知道 MatrixCursor,但选项 nr 1 似乎对我来说是最好的。每次用户搜索某些东西(我用我的适配器显示搜索结果)时,将 3000 行大约 1MB 的总数据转换成一张地图听起来很丑……作为将来的参考,我在原始帖子中使用的实现怎么样,在我看来,这似乎是继 MatrixCursor 之后的下一个最好的东西?考虑到在这种特殊情况下,我真正需要的是访问 newView()/bindView()/getView() 方法。
  • 应该可以;它似乎类似于选项 1,因为您有两个适配器并根据数据类型选择一个。将任何 post-newView/bindView 方法分解为一个通用的 helperClass 应该是可以的。
猜你喜欢
  • 1970-01-01
  • 2011-01-16
  • 2019-08-18
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 2020-12-16
  • 1970-01-01
  • 2011-06-12
相关资源
最近更新 更多