SimpleCursorAdapter и ViewBinder - привязка данных к элементам ListView, которые можно получить по нажатию
Так что у меня есть ListView
(используя ListActivity
) что я заселяю из SQLiteDatabase
, Я пытаюсь прикрепить идентификатор (PK) строки к представлению, чтобы onListItemClick
из каждого элемента списка, я могу делать вещи с этим идентификатором.
Я прочитал, что произвольные данные могут быть установлены в View
с помощью setTag
и извлекается с getTag
(У меня еще не было этой работы успешно, так что это может быть проблемой). Вот сокращенная версия того, что я использую (для простоты / краткости):
public class Favorites extends ListActivity {
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
FavoritesDB db = FavoritesDB.getInstance(this);
Cursor c = db.fetchFavorites();
startManagingCursor(c);
String[] columns = new String[] { "_id" };
int[] to = new int[] { R.id.word };
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.favorite, c, columns, to);
adapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
view.setTag(cursor.getInt(0));
return true;
}
});
setListAdapter(adapter);
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
Object wordID = v.getTag();
Toast.makeText(getBaseContext(), "ID=" + wordID, 1).show();
}
}
ListView
населяется, и Toast
действительно появляется, но это всегда "ID=null"
так что, очевидно, идентификатор не устанавливается в ViewBinder
позвонить setTag
(или не извлекается свойство с getTag
).
2 ответа
Это зависит от вашей реализации R.layout.favorite
, Если у вас есть этот макет, содержит родительское представление с дочерними TextViews, например, для установленного вами тега для TextViews, в то время как View v получен от onListItemClick()
это родительский вид. Вам необходимо убедиться, что вы получите тег для того же представления, которое вы установили с помощью:
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
Object wordID = v.getChild(0).getTag();
Toast.makeText(getBaseContext(), "ID=" + wordID, 1).show();
}
Вы, вероятно, должны получить курсор от адаптера. Таким образом, если ваш курсор будет заменен, вы все еще получаете действительный курсор.
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
Cursor cursor = adapter.getCursor();
cursor.moveToPosition(position);
String id = cursor.getString(cursor.getColumnIndex("primary key field name in database");
Toast.makeText(getBaseContext(), "ID=" + id, 1).show();
}
ПРИМЕЧАНИЕ: ваш адаптер должен быть объявлен как SimpleCursorAdapter
в противном случае вы должны опустить его.