【问题标题】:Android, using SimpleCursorAdapter to set colour not just stringsAndroid,使用 SimpleCursorAdapter 设置颜色而不仅仅是字符串
【发布时间】:2011-04-06 22:04:50
【问题描述】:

我在应用程序的列表中设置了一个简单的光标适配器,如下所示:

private static final String fields[] = {"GenreLabel", "Colour", BaseColumns._ID};


datasource = new SimpleCursorAdapter(this, R.layout.row, data, fields, new int[]{R.id.genreBox, R.id.colourBox});

R.layout.row 包含两个 TextView(genreBox 和 colourBox)。我不想将 TextView 的内容设置为 "Colour" 的值,而是将其背景颜色设置为该值。

我需要做什么才能实现这一目标?

【问题讨论】:

    标签: android listview simplecursoradapter


    【解决方案1】:

    查看SimpleCursorAdapter.ViewBinder

    setViewValue 基本上是您对Cursor 中的数据做任何您想做的事情的机会,包括设置视图的背景颜色。

    例如:

    SimpleCursorAdapter.ViewBinder binder = new SimpleCursorAdapter.ViewBinder() {
        @Override
        public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
            String name = cursor.getColumnName(columnIndex);
            if ("Colour".equals(name)) {
                int color = cursor.getInt(columnIndex);
                view.setBackgroundColor(color);
                return true;
            }
            return false;
        }
    }
    datasource.setViewBinder(binder);
    

    更新 - 如果您使用的是自定义适配器(扩展 CursorAdaptor),那么代码不会发生太大变化。你会覆盖getViewbindView

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView != null) {
            return convertView;
        }
        /* context is the outer activity or a context saved in the constructor */
        return LayoutInflater.from(context).inflate(R.id.my_row);
    }
    
    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        int color = cursor.getInt(cursor.getColumnIndex("Colour"));
        view.setBackgroundColor(color);
        String label = cursor.getString(cursor.getColumnIndex("GenreLabel"));
        TextView text = (TextView) findViewById(R.id.genre_label);
        text.setText(label);
    }
    

    您的手动操作要多一些,但这或多或少是相同的想法。请注意,在所有这些示例中,您可以通过缓存列索引而不是通过字符串查找它们来节省性能。

    【讨论】:

    • 谢谢,这正是我所需要的,也非常简单。
    • 太棒了!我一直使用自定义适配器,但通常只需使用 ViewBinder 即可完成您的需求。
    • 您是否有机会也提供一个自定义适配器方法的示例?最终,我的应用程序中会包含大量适配器,我认为从长远来看,扩展 simplecursorapader 可能是最好的方法。
    • 添加了一些代码。请注意,您可能想要扩展 CursorAdapter 而不是 SimpleCursorAdapter
    • 谢谢,第二种方法看起来更适合我最终想要做的事情。感谢您提供有关 CursorAdapter 与 SimpleCursorAdapter 的说明。
    【解决方案2】:

    您要查找的内容需要自定义光标适配器。你可以继承SimpleCursorAdapter。这基本上可以访问创建的视图(尽管您将自己创建它)。

    有关完整示例,请参阅自定义 CursorAdapters 上的 blog post。特别是,我认为您需要覆盖bindView

    【讨论】:

      猜你喜欢
      • 2015-11-05
      • 2021-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-23
      • 2013-12-15
      相关资源
      最近更新 更多