我在应用程序的列表中设置了一个简单的游标适配器,如下所示:
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由两个TextViews(genreBox和colourBox)组成。我没有将TextView的内容设置为“Color”的值,而是将其背景颜色设置为该值。
我需要做些什么来实现这个目标?
答案 0 :(得分:13)
查看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
),则代码不会发生很大变化。您将覆盖getView
和bindView
:
@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);
}
你手动做得更多,但它或多或少都是一样的想法。请注意,在所有这些示例中,您可以通过缓存列索引来节省性能,而不是通过字符串查找它们。
答案 1 :(得分:0)
您需要的是自定义游标适配器。您可以继承SimpleCursorAdapter。这基本上可以在创建时访问视图(尽管您将自己创建)。
有关完整示例,请参阅自定义CursorAdapters上的blog post。特别是,我认为您需要覆盖bindView
。