所以我有一个ListView(使用ListActivity)从SQLiteDatabase填充。我正试图将行的id(pk)附加到视图中,这样每个列表项的onListItemClick都可以使用该id进行操作。
我已经读过,使用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",因此很显然,id没有在对ViewBindersetTag调用中设置(或者没有用getTag检索属性)。

最佳答案

这取决于R.layout.favorite的实现。如果此布局包含父视图和子文本视图,例如,您设置的标记是文本视图,而从onListItemClick()接收的视图v是父视图。您需要确保收到通过使用以下命令设置的同一视图的标记:

    @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();
    }

07-24 09:49
查看更多