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 而你可以直接从持有人那里拿来)。