【发布时间】: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