Android - 获取recyclerview点击项目的SQLite对象数据
Android - Get recyclerview clicked item's SQLite object data
我想删除 RecyclerView 的一个点击项,其中的项包含来自 SQLite 的数据。
我已成功检测到 RecyclerView 的点击项目(遵循 https://www.youtube.com/watch?v=69C1ljfDvl0&t=487s 的教程),但无法通过我已创建的删除方法删除要删除的项目数据。
这是删除方法:
public boolean deleteOne(OneTimeActivityModel oneTimeActivityModel){
SQLiteDatabase db = this.getWritableDatabase();
String queryString = "DELETE FROM " + ONE_TIME_ACTIVITY_TABLE + " WHERE " + COLUMN_ACTIVITY_NAME + " = " + oneTimeModel.getId();
Cursor cursor = db.rawQuery(queryString, null);
if(cursor.moveToFirst()){
return true;
}
else{
return false;
}
}
该方法在 ListView 中有效,因为在 ListView 中我可以在单击项目时使用 .getItemAtPosition(position) 并获取要发送到该方法的项目的模型。
这是点击项目的代码:
@Override
public void onNoteClick(int position) {
OneTimeDatabaseHelper oneTimeDatabaseHelper = new OneTimeDatabaseHelper(ListActivity.this);
OneTimeActivityModel clickedActivity; // How to make this variable become the model of the clicked item
// in ListView I can use this following line
// OneTimeActivityModel clickedActivity = (OneTimeActivityModel) parent.getItemAtPosition(position);
oneTimeDatabaseHelper.deleteOne(clickedActivity); //To be sent to the delete method
}
看来我需要将项目存储在要发送到方法的“oneTimeDatabaseHelper”变量中。
如何获取RecyclerView中点击item的数据?
我认为在这种情况下没有必要获得整个模型。无需将整个 OneTimeActivityModel
作为参数,您可以只使用 ID 或任何唯一标识符,以便用作 WHERE
SQL 子句中的删除条件。
可以这样改写:
public boolean deleteOne(String oneTimeID){
SQLiteDatabase db = this.getWritableDatabase();
String queryString = "DELETE FROM " + ONE_TIME_ACTIVITY_TABLE + " WHERE " + COLUMN_ACTIVITY_NAME + " = " + "'" + oneTimeID + "'";
Cursor cursor = db.rawQuery(queryString, null);
if(cursor.moveToFirst()){
return true;
}
else{
return false;
}
}
第二个问题,你可以取当前点击的item的ID,然后你把对应的ID传给oneTimeDatabaseHelper.deleteOne
。提供依据:
@Override
public void onNoteClick(int position) {
OneTimeDatabaseHelper oneTimeDatabaseHelper = new OneTimeDatabaseHelper(ListActivity.this);
OneTimeActivityModel clickedActivity = dataSource.get(position);
oneTimeDatabaseHelper.deleteOne(clickedActivity.getID());
adapter.notifyDataSetChanged();
}
尽管我的回答是,如果我是你,我会在 onBindViewHolder
方法中注入模型,并在 ViewHolder
级别处理每个模型,而不是通过 onClick
在通用适配器class。例如:
@Override
public void onBindViewHolder(ViewHolder holder, int position, OneTimeActivityModel model) {
holder.bindObject(model);
}
在 ViewHolder
中,您将执行以下操作:
// omitted for brevity
public void bindObject(OneTimeActivityModel model) {
view.setOnClickListener(...) // do whatever you want here.
}
我的方法优于你的方法的一个优点是模型是强类型的,你不必调用 notifyDataSetChanged
and/or 那样获取你的数据源(使用 position
而你可以直接从持有人那里拿来)。
我想删除 RecyclerView 的一个点击项,其中的项包含来自 SQLite 的数据。
我已成功检测到 RecyclerView 的点击项目(遵循 https://www.youtube.com/watch?v=69C1ljfDvl0&t=487s 的教程),但无法通过我已创建的删除方法删除要删除的项目数据。 这是删除方法:
public boolean deleteOne(OneTimeActivityModel oneTimeActivityModel){
SQLiteDatabase db = this.getWritableDatabase();
String queryString = "DELETE FROM " + ONE_TIME_ACTIVITY_TABLE + " WHERE " + COLUMN_ACTIVITY_NAME + " = " + oneTimeModel.getId();
Cursor cursor = db.rawQuery(queryString, null);
if(cursor.moveToFirst()){
return true;
}
else{
return false;
}
}
该方法在 ListView 中有效,因为在 ListView 中我可以在单击项目时使用 .getItemAtPosition(position) 并获取要发送到该方法的项目的模型。
这是点击项目的代码:
@Override
public void onNoteClick(int position) {
OneTimeDatabaseHelper oneTimeDatabaseHelper = new OneTimeDatabaseHelper(ListActivity.this);
OneTimeActivityModel clickedActivity; // How to make this variable become the model of the clicked item
// in ListView I can use this following line
// OneTimeActivityModel clickedActivity = (OneTimeActivityModel) parent.getItemAtPosition(position);
oneTimeDatabaseHelper.deleteOne(clickedActivity); //To be sent to the delete method
}
看来我需要将项目存储在要发送到方法的“oneTimeDatabaseHelper”变量中。
如何获取RecyclerView中点击item的数据?
我认为在这种情况下没有必要获得整个模型。无需将整个 OneTimeActivityModel
作为参数,您可以只使用 ID 或任何唯一标识符,以便用作 WHERE
SQL 子句中的删除条件。
可以这样改写:
public boolean deleteOne(String oneTimeID){
SQLiteDatabase db = this.getWritableDatabase();
String queryString = "DELETE FROM " + ONE_TIME_ACTIVITY_TABLE + " WHERE " + COLUMN_ACTIVITY_NAME + " = " + "'" + oneTimeID + "'";
Cursor cursor = db.rawQuery(queryString, null);
if(cursor.moveToFirst()){
return true;
}
else{
return false;
}
}
第二个问题,你可以取当前点击的item的ID,然后你把对应的ID传给oneTimeDatabaseHelper.deleteOne
。提供依据:
@Override
public void onNoteClick(int position) {
OneTimeDatabaseHelper oneTimeDatabaseHelper = new OneTimeDatabaseHelper(ListActivity.this);
OneTimeActivityModel clickedActivity = dataSource.get(position);
oneTimeDatabaseHelper.deleteOne(clickedActivity.getID());
adapter.notifyDataSetChanged();
}
尽管我的回答是,如果我是你,我会在 onBindViewHolder
方法中注入模型,并在 ViewHolder
级别处理每个模型,而不是通过 onClick
在通用适配器class。例如:
@Override
public void onBindViewHolder(ViewHolder holder, int position, OneTimeActivityModel model) {
holder.bindObject(model);
}
在 ViewHolder
中,您将执行以下操作:
// omitted for brevity
public void bindObject(OneTimeActivityModel model) {
view.setOnClickListener(...) // do whatever you want here.
}
我的方法优于你的方法的一个优点是模型是强类型的,你不必调用 notifyDataSetChanged
and/or 那样获取你的数据源(使用 position
而你可以直接从持有人那里拿来)。