RecyclerView
にはCardView
が膨らんだ。私はAlarmDBHelper
という名前のデータベースヘルパーを持っています。私の断片の1つでは、アラームを追加するボタンを使用して、RecyclerView
とDatabase
に追加します。データベースビューアを使用すると、エントリが正しく追加されていることがわかります。RecyclerViewでスワイプを解除するとエラーが発生する
問題は、を使用してSwipe-To-Dismiss
を追加したことです。しかし、私がカードビューを削除するためにスワイプすると、削除は永続的ではありません。 cardview
は削除されましたが、データベースのエントリは削除されていません。別の断片に移動して前のページに戻ると、cardviewのすべてが再び表示されていることがわかります。楽しい部分は、今回は削除が永久的です。つまり、今すぐスワイプすると、永遠に削除されます。
マイAlarmDBHelper
package com.aniket.digitalapprentice;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Aniket on 4/18/2016.
*/
public class AlarmDBHelper extends SQLiteOpenHelper {
public static final String DATABASE_NAME="alarmsManager";
public static final int DATABASE_VERSION=1;
public static final String TABLE_ALARMS="alarms";
public static final String KEY_ID="id";
public static final String KEY_LABEL="label";
public static final String KEY_TIME="time";
public static final String KEY_DATE="date";
public SimpleDateFormat dateFormat=new SimpleDateFormat("dd/MM/yyyy");
public SimpleDateFormat timeFormat=new SimpleDateFormat("HH:mm");
public AlarmDBHelper(Context context)
{
super(context,DATABASE_NAME,null,DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String CREATE_ALARM_TABLE="CREATE TABLE " + TABLE_ALARMS + "(" + KEY_ID + " INTEGER PRIMARY KEY," + KEY_LABEL + " TEXT," + KEY_DATE+" TEXT," + KEY_TIME + " TEXT" + ")";
db.execSQL(CREATE_ALARM_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS "+TABLE_ALARMS);
onCreate(db);
}
public void addAlarm(Alarm alarm)
{
SQLiteDatabase db=this.getWritableDatabase();
ContentValues values=new ContentValues();
values.put(KEY_LABEL,alarm.getLabel());
values.put(KEY_DATE,dateFormat.format(alarm.getDate()));
values.put(KEY_TIME,timeFormat.format(alarm.getTime()));
db.insert(TABLE_ALARMS,null,values);
db.close();
}
public Alarm getAlarm(int id) throws ParseException {
SQLiteDatabase db=this.getReadableDatabase();
Cursor cursor=db.query(TABLE_ALARMS, new String[]{KEY_ID,KEY_LABEL,KEY_DATE,KEY_TIME},KEY_ID+"=?",new String[]{String.valueOf(id)},null,null,null,null);
if(cursor!=null) cursor.moveToFirst();
Alarm alarm=new Alarm(Integer.parseInt(cursor.getString(0)),cursor.getString(1),dateFormat.parse(cursor.getString(2)),timeFormat.parse(cursor.getString(3)));
return alarm;
}
public ArrayList<Alarm> getAllAlarms() throws ParseException {
ArrayList<Alarm> alarmList=new ArrayList<Alarm>();
String selectQuery = "SELECT * FROM " + TABLE_ALARMS;
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
if(cursor.moveToFirst())
{
do {
Alarm alarm=new Alarm(cursor.getInt(0),cursor.getString(1),dateFormat.parse(cursor.getString(2)),timeFormat.parse(cursor.getString(3)));
alarmList.add(alarm);
}while (cursor.moveToNext());
}
cursor.close();
return alarmList;
}
public int getAlarmCount()
{
String countQuery = "SELECT * FROM " + TABLE_ALARMS;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(countQuery, null);
cursor.close();
// return count
return cursor.getCount();
}
public int updateAlarm(Alarm alarm)
{
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_LABEL,alarm.getLabel());
values.put(KEY_TIME,timeFormat.format(alarm.getTime()));
values.put(KEY_DATE,dateFormat.format(alarm.getDate()));
return db.update(TABLE_ALARMS,values,KEY_ID+"=?",new String[]{String.valueOf(alarm.getId())});
}
public void deleteAlarm(Alarm alarm)
{
SQLiteDatabase db=this.getWritableDatabase();
db.delete(TABLE_ALARMS,KEY_ID+" =? ",new String[]{String.valueOf(alarm.getId())});
db.close();
}
}
私ItemTouchHelper
ItemTouchHelper.SimpleCallback simpleCallback=new ItemTouchHelper.SimpleCallback(0,ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT) {
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
int index=viewHolder.getAdapterPosition();
db.deleteAlarm(alarmList1.get(index));
Toast.makeText(getContext(),"deleted "+(index),Toast.LENGTH_SHORT).show();
alarmList1.remove(index);
alarmAdapter.notifyItemRemoved(index);
}
};
ItemTouchHelper itemTouchHelper=new ItemTouchHelper(simpleCallback);
itemTouchHelper.attachToRecyclerView(recyclerView);
:としてその後、あなたのアダプタクラスでremove関数を作る
。私はデータベースにアラームを追加したとき(そして更新するとき)、アラームのKey値が更新されていないことを理解しました。私はキーを更新するプログラムを実装し、それは働いた –