SimpleCursorAdapter和ViewBinder - 将数据绑定到ListView项目,以便在单击时检索

时间:2011-12-05 10:43:47

标签: android android-listview simplecursoradapter android-viewbinder

所以我有一个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();
    }       
}

正在填充ListViewToast确实显示,但始终为"ID=null",因此显然未在ViewBinder调用中设置ID至setTag(或未使用getTag检索属性。)

2 个答案:

答案 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,你应该向下转发它。