У меня есть таблица SQLite под названием «Узлы» с набором всех узлов (каждый узел имеет несколько свойств).
В упражнении я использую расширение SimpleCursorAdapter для отображения подмножества таблицы Nodes на основе запроса SQL, передавая ему курсор над таблицей результатов (из запроса).
{id_long, name_string, description_string, nodetype_enum_toString...}
1, "home", "home_desc", "cool"
2, "item1", "item1_desc", "warm"
3, "item2", "item2_desc", "hot"
4, "item3", "item3_desc", "warm"
5, "item4", "item4_desc", "hot"
Я хочу изменить каждый из элементов списка в моей ListActivity так, чтобы он отображал разные цвета в зависимости от того, является ли элемент прохладным, теплым или горячим. У меня маленький (пустой) вид, но он всегда по умолчанию белый (часть else).
public View getView(int position, View convertView, ViewGroup parent) {
convertView = super.getView(position, convertView, parent);
if (convertView == null) convertView = View.inflate(mContext, R.layout.viewstack_item, null);
View nodetype_view = (View) convertView.findViewById(R.id.nodetype_view);
mGenCursor_cur = mDataHelper_db.getAll();
mGenCursor_cur.moveToPosition(position);
Log.i("test", "node type key " + mGenCursor_cur.getColumnIndex(DataHelper.NODES_TYPE_KEY));
String type_nt = mGenCursor_cur.getString(mGenCursor_cur.getColumnIndex(DataHelper.NODES_TYPE_KEY));
String name_str = mGenCursor_cur.getString(mGenCursor_cur.getColumnIndex(DataHelper.NODES_NAME_KEY));
Log.i("getView", title_str + "typeis " + type_nt + " at position " + position);
if (prio_np.equals(NodePrio.HIGH.toString())) {
Log.i("prio_np", "high red");
prioView_view.setBackgroundColor(Color.RED);
} else if (prio_np.equals(NodePrio.NORMAL.toString())) {
Log.i("prio_np", "norm magenta");
prioView_view.setBackgroundColor(Color.MAGENTA);
} else {
Log.i("prio_np", "else (low) white");
prioView_view.setBackgroundColor(Color.WHITE);
}
mGenCursor_cur.close();
bindView(convertView, mContext, getCursor());
return(convertView);
}
Моя проблема в том, что, хотя курсор, переданный в SimpleListAdapter, будет содержать _ID (я предполагаю) соответствующих узлов в подмножестве, которое я хочу, параметр position в getView равен локально для подмножества, поэтому я не могу сопоставить его с таблицей узлов. Я скучаю по какой-то простой технике?
Как всегда, любая помощь приветствуется.
Комментарий 4 отмеченного ответа помог мне решить эту проблему:
сохраняя курсор, который был передан SimpleCursorAdapter как переменную-член, затем используя move to position и getLong:
mCursor_cur.moveToPosition(position);
long id = mCursor_cur.getLong(0);
, где position - это локальный параметр в методе getView (), а 0 используется для getLong, поскольку db_id - это первый столбец в курсоре, переданном в SimpleCursorAdapter