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

时间:2011-05-02 19:10:27

标签: android listview simplecursoradapter

我正在尝试根据我的SQLite DB中的信息创建一个列表视图。我目前设置的代码只是相应地显示每一行,并用数据填充3个textviews。我希望能够使用某种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);

4 个答案:

答案 0 :(得分:9)

您应该覆盖适配器的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;
    }
};

并根据位置设置行的背景(是奇数还是偶数)。

答案 1 :(得分:2)

这应该这样做。 感谢这篇文章,我遇到了同样的问题,但经过这个问题后,问题解决了,如下图所示,

    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);

答案 2 :(得分:1)

我在Activity上实现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
    }
}

答案 3 :(得分:0)

我建议扩展BaseAdapter,手动填充列表数据并在适配器类中保留该数据的本地副本。然后,当您实施getView(...)方法时,您可以使用您生成的View的位置或ID来获取相应的数据以检查“Room1”,并更改View您基于该比较返回。

rekaszeru的答案有正确的想法,但听起来你需要的信息比位置和ID更多,这就是为什么我建议降低一级并直接实现BaseAdapter