【问题标题】:Android ListView SimpleCursorAdapter TextView and ImageButtonAndroid ListView SimpleCursorAdapter TextView 和 ImageButton
【发布时间】:2019-08-19 15:38:52
【问题描述】:

我有一个由 SQLite db 表支持的 ListView,该表在每行的列表项 XML 中显示一个歌曲标题 (TextView) 和一个按钮 (ImageButton)。我为按钮设置了一个 onClick() 事件,以便对他们单击的行上的歌曲执行操作。

ListView 使用 SimpleCursorAdapter 正确显示 db 表中的所有内容。

问题是:当我单击 ImageButton 时,它会正确调用带有参数的按钮的 onClick 事件(视图视图);如何从传递到事件的视图中获取单击按钮的行的光标行数据?我需要行 _ID 值才能对正确的歌曲采取行动。如果我可以从该对象访问,我还可以访问 Class 字段中的 dbAdapter。

注意:当我将 ImageButton 添加到项目列表时,如果单击包含歌曲的行或按钮,onItemClickListener 将不再触发。

如果有更好的设计模式可以让用户选择 ListView 项目并对其执行操作,请告诉我。我的意图是最终为每行添加 2-3 个按钮,用于删除、信息、播放等。

// Load ListView with previously downloaded files
dbHelper = new DBHelper(this);

// Create Cursor holding db data
Cursor cursor = dbHelper.fetchData();

// Map db columns to view ids
String[] columns = new String[]{
        DBContract.Songs.COLUMN_NAME_NAME,
        DBContract.Songs.COLUMN_NAME_LOADED_DATETIME
};

int[] to = new int[]{
        R.id.songName,
        R.id.songDateLoaded
};

// Create the dbAdapter
dbAdapter = new SimpleCursorAdapter(this, R.layout.songs, cursor, columns, to, 0);

// Assign the adapter to the ListView
ListView listView = findViewById(R.id.songsListView);
listView.setAdapter(dbAdapter);

// Anonymous OnItemClickListener
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {...

【问题讨论】:

  • 您可以使用setTag()/getTag() 方法将ID 附加到您的ImageButtons。
  • 嗨 Mike,你是建议我在适配器 getView() 方法中使用 setTag() 吗?但是我没有重写该方法,因为我使用的是 SimpleCursorAdapter,因此甚至没有实例化 Adapter 类。也许我错过了你的观点。但我认为重点是使用 SimpleCursorAdapter 并且不需要实现 CursorAdapter 对象。而且,可以肯定的是,您是说没有其他方法可以获取有关 onClick 事件和 View 参数的信息???
  • 你不必继承它。您可以使用SimpleCursorAdapter.ViewBinder。而且,是的,还有其他方法,但这可能就像他们得到的一样简单
  • 谢谢迈克。我是 Android 的相对新手,5-6 年后又回来了。也可能是永恒。我不确定 ViewBinder 将如何工作,就像您上面提到的那样。我刚刚查看了您提供的链接的文档。似乎我也可以只使用 ImageView 而不是 ImageButton,然后我可以使用 onItemClick() 事件,其中包含我在事件参数中需要的信息。但是,在这种情况下,我怎么知道用户点击了其中一个图像(以及哪个 ImageView),而不是简单的歌曲标题?无论哪种方式都适合我。
  • 我进行了一次测试,以确保我正确地思考了所有问题,我对此非常满意:drive.google.com/file/d/10q11-eajTfFjlXCx9hJrXfrMuIqKJeVT/…

标签: android listview simplecursoradapter


【解决方案1】:

在 Mike 的坚持不懈和耐心的帮助下,我实施了以下解决方案。

关键是在 SimpleCursorAdapter 上使用 setViewBinder(),然后将 db 行键分配给 ImageButton 的 Tag 属性。然后,在 XML 中定义一个 onClick() 事件,在该事件中,您现在可以从 view.getTag() 方法访问 db 行键。

// Bind the Cursor record _ID to the ImageButton Tag property;
// So when it is called, we can delete the record with the Tag property value.
dbAdapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
    @Override
    public boolean setViewValue(View view, Cursor cursor, int i) {
        if (view.getId() == R.id.songName) {
            final long id = cursor.getLong(cursor.getColumnIndex(DBContract.Songs._ID));
            final ImageButton delete = ((View)view.getParent()).findViewById(R.id.deleteSongButton);
            delete.setTag(id);
        }
        return false;
    }
});

public void DeleteSong(View view) {
    final long id = (long) view.getTag();
    dbHelper.RemoveSong(id);
    dbHelper.fetchSongsAndUpdateAdapter(dbAdapter);
    Toast.makeText(this, "Song removed!", Toast.LENGTH_LONG).show();
}

谢谢迈克!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    • 2013-07-20
    相关资源
    最近更新 更多