【问题标题】:SimpleCursorAdapter and ViewBinder - Binding data to ListView items to be retrieved on clickSimpleCursorAdapter 和 ViewBinder - 将数据绑定到要在单击时检索的 ListView 项目
【发布时间】:2011-12-05 10:43:47
【问题描述】:

所以我有一个ListView(使用ListActivity),我从SQLiteDatabase 填充。我正在尝试将行的 ID (PK) 附加到视图,以便每个列表项的 onListItemClick 可以使用该 ID 执行操作。

我读过可以使用setTag 将任意数据设置为View 并使用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 没有在 ViewBinder 调用 setTag 中设置(或者不是t 正在使用getTag 检索属性。

【问题讨论】:

  • onListItemClick,我希望能够处理分配给列表项的任意数据(在此示例中,分配数据的 SQLite 行的 ID(主键))。

标签: android android-listview simplecursoradapter android-viewbinder


【解决方案1】:

这取决于您对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();      
    }    

【讨论】:

  • 这看起来很有希望。你是对的,最喜欢的布局是带有子文本视图的线性布局。而不是让孩子点击,有没有办法我可以将标签(在ViewBinder中)设置为linearlayout父级而不是textview? ViewBinder 将其设置为子容器而不是“主”容器是否有原因?
  • ViewBinder 将其设置为子级的原因是每次适配器从光标列填充视图“to”时都会运行 ViewBinder。我想你可以通过在 ViewBinder 中更改:view.setTag(cursor.getInt(0));view.getParent().setTag(cursor.getInt(0)); 来做到这一点
  • 我最终使用了一个自定义适配器,但您提供的信息比让它工作更有价值(您的回答也是如此)-非常感谢
  • 我在这里发布了一个类似的问题:stackoverflow.com/questions/8384757/…如果你想看看
【解决方案2】:

您可能应该从适配器获取光标。这样,如果您的光标被替换,您仍然可以获得有效的光标。

@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,否则你应该向下转换它。

【讨论】:

    猜你喜欢
    • 2011-12-23
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    • 2020-07-31
    • 1970-01-01
    相关资源
    最近更新 更多