Android 如何使用SimpleCorsorAdapter更改特定行的背景

Android 如何使用SimpleCorsorAdapter更改特定行的背景,android,listview,simplecursoradapter,Android,Listview,Simplecursoradapter,我正在尝试创建一个listview,它是从SQLite数据库中的信息生成的。我目前已经将代码设置为只显示相应的每一行,并用数据填充3个文本视图。我希望能够使用某种If语句来检查其中一个值是否为“Room1”,然后将该行的背景设置为某种颜色 这样,列表中的每一行将根据数据的“房间”具有不同的背景 我已经尝试过扩展SimpleCursorAdapter,但对于如何从中得到我想要的东西,我有点不知所措 以下是我目前为SimpleCursorAdapter提供的内容: Cursor notesCurso

我正在尝试创建一个listview,它是从SQLite数据库中的信息生成的。我目前已经将代码设置为只显示相应的每一行,并用数据填充3个文本视图。我希望能够使用某种If语句来检查其中一个值是否为“Room1”,然后将该行的背景设置为某种颜色

这样,列表中的每一行将根据数据的“房间”具有不同的背景

我已经尝试过扩展SimpleCursorAdapter,但对于如何从中得到我想要的东西,我有点不知所措

以下是我目前为SimpleCursorAdapter提供的内容:

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个垂直堆叠的其他
文本视图
(取决于用户偏好)。那些
文本视图
也进行了动态更改<代码>设置视图值
在我的情况下效果最好。这毕竟只是一个建议。