我想洗掉一個 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 中獲取點擊專案的資料?
uj5u.com熱心網友回復:
我相信在這種情況下不需要獲取整個模型。OneTimeActivityModel您可以只使用 ID 或任何唯一識別符號,而不是將整體作為引數,以便用作WHERESQL 子句中的洗掉條件。
可以這樣改寫:
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通用配接器類中的蠻力。例如:
@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像那樣呼叫和/或獲取你的資料源(使用position而你可以從持有者那里獲取它)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/401091.html
標籤:爪哇 安卓 sqlite android-recyclerview
