所以我有一个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"
,因此显然未在ViewBinder
调用中设置ID至setTag
(或未使用getTag
检索属性。)
答案 0 :(得分:2)
这取决于您R.layout.favorite
的实施情况。如果你有这个布局包含一个带有子TextViews的父视图,例如您设置的标签用于TextViews,而从onListItemClick()
收到的View 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();
}
答案 1 :(得分:0)
您可能应该从适配器获取光标。这样,如果你的光标被替换,你仍然会得到一个有效的光标。
@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
,你应该向下转发它。