Android 如何使用SimpleCorsorAdapter更改特定行的背景
我正在尝试创建一个listview,它是从SQLite数据库中的信息生成的。我目前已经将代码设置为只显示相应的每一行,并用数据填充3个文本视图。我希望能够使用某种If语句来检查其中一个值是否为“Room1”,然后将该行的背景设置为某种颜色 这样,列表中的每一行将根据数据的“房间”具有不同的背景 我已经尝试过扩展SimpleCursorAdapter,但对于如何从中得到我想要的东西,我有点不知所措 以下是我目前为SimpleCursorAdapter提供的内容:Android 如何使用SimpleCorsorAdapter更改特定行的背景,android,listview,simplecursoradapter,Android,Listview,Simplecursoradapter,我正在尝试创建一个listview,它是从SQLite数据库中的信息生成的。我目前已经将代码设置为只显示相应的每一行,并用数据填充3个文本视图。我希望能够使用某种If语句来检查其中一个值是否为“Room1”,然后将该行的背景设置为某种颜色 这样,列表中的每一行将根据数据的“房间”具有不同的背景 我已经尝试过扩展SimpleCursorAdapter,但对于如何从中得到我想要的东西,我有点不知所措 以下是我目前为SimpleCursorAdapter提供的内容: Cursor notesCurso
Cursor notesCursor = myDbHelper.fetchDayPanelNotes(type, day);
startManagingCursor(notesCursor);
String[] from = new String[]{DataBaseHelper.KEY_NAME, DataBaseHelper.KEY_ROOM, DataBaseHelper.KEY_TIME};
int[] to = new int[]{R.id.text1, R.id.text2, R.id.text3};
SimpleCursorAdapter notes = new SimpleCursorAdapter(this, R.layout.main_row, notesCursor, from, to);
setListAdapter(notes);
您应该覆盖适配器的
getView
方法:
SimpleCursorAdapter notes = new SimpleCursorAdapter(
this, R.layout.main_row, notesCursor, from, to)
{
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
final View row = super.getView(position, convertView, parent);
if (position % 2 == 0)
row.setBackgroundResource(android.R.color.darker_gray);
else
row.setBackgroundResource(android.R.color.background_light);
return row;
}
};
并根据位置设置行的背景(是奇数还是偶数)。我建议扩展
BaseAdapter
,手动填充列表数据,并在适配器类中保留该数据的本地副本。然后,当您实现getView(…)
方法时,您可以使用正在生成的视图的位置或ID来获取相应的数据以对照“Room1”进行检查,并根据该比较更改返回的视图
rekaszeru的回答完全正确,但听起来你需要的信息比职位和ID更多,这就是为什么我建议降低级别,直接实现BaseAdapter
。我在我的活动上实现SimpleCursorAdapter.ViewBinder,然后覆盖setViewValue
public class MyActivity extends Activity
implements SimpleCursorAdapter.ViewBinder {
SimpleCursorAdapter myAdapter = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState)
// Initialize myAdapter
myAdapter.setViewBinder(this);
}
@Override
public boolean setViewValue(View view, Cursor cursor, int column) {
// Put code to process row data here
}
}
这应该可以做到。
多亏了这篇文章,我遇到了完全相同的问题,但经过这篇文章之后,问题解决了,如下所示
SimpleCursorAdapter notes = new SimpleCursorAdapter(this, R.layout.notes_row, mNotesCursor, from, to)
{
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
cursor.moveToPosition(position);
String s = cursor.getString(mursor.getColumnIndex("roomnumber"));
final View row = super.getView(position, convertView, parent);
if (s.equalsIgnoreCase("room1"))
row.setBackgroundColor(Color.parseColor("#480000"));
else if (s.equalsIgnoreCase("room2"))
row.setBackgroundColor(Color.parseColor("#000040"));
else
row.setBackgroundColor(Color.parseColor("#004000"));
return row;
}
};
setListAdapter(notes);
使用这种方法只是为了测试这种可能性,会出现一些奇怪的情况。列表会正确填充,每行颜色交替,但一旦我开始滚动,所有行都会变成深灰色,即使我向上滚动。一旦我重新加载页面,它就会正确地显示它们的交替,直到我滚动为止。知道为什么会这样吗?知道。您仍然需要设置背景色,因此还需要else子句。这些行视图是循环使用的,不会在每次布局时都创建,因此如果一个行视图以前用作偶数项渲染器,而现在是奇数,则必须设置其正确的背景。当然,不必检查行是否为奇数/偶数位置,您需要检查它是否为“Room1”。如果要将交替行颜色设置为列表视图
,知道项目在数据提供程序中的位置就足够了(除了要设置的颜色…),这是正确的。但这不是问题的目的。“列表中的每一行都有不同的背景,这取决于数据的“房间”是用于“您能提供一个如何工作的示例吗?我在AndroidCookbook上写了一个扩展BaseAdapter
的示例:这也不起作用,因为通常您不想更改单个单元格的背景,但是整一排。单元的高度可能不同,这使得此解决方案看起来相当混乱。重写getView()更好。看看我从哪里开始回答“我实现了…”,这正是我的意思。当我回答这个问题时,我正在开发的应用程序在左边有一个“正方形”TextView
,它以HH:mm
格式显示时间,但光标提供ISO8601格式的时间。该方块TextView
也必须有默认的黑色背景,有时是橙色,有时是红色。右侧是1到2个垂直堆叠的其他文本视图
(取决于用户偏好)。那些文本视图
也进行了动态更改<代码>设置视图值
在我的情况下效果最好。这毕竟只是一个建议。