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 в противном случае вы должны опустить его.

Другие вопросы по тегам