0

RecyclerViewにはCardViewが膨らんだ。私はAlarmDBHelperという名前のデータベースヘルパーを持っています。私の断片の1つでは、アラームを追加するボタンを使用して、RecyclerViewDatabaseに追加します。データベースビューアを使用すると、エントリが正しく追加されていることがわかります。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); 

答えて

0

としてデータベースのあなたの削除機能を作る:私は問題を解決し

public void remove(int pos){ 
    // The name of the class which is used as a helper for database to get 
    // and set value suppose DatabaseHelper 

    DatabaseHelper dbHelper = alarmlist.get(pos); 
    int id = dbHelper.getId(); 

    AlarmDBHelper alarmHelper = new AlarmDBHelper(context); 
    if(alarmHelper.deleteAlarm(id)){ 
    alarmlist.remove(pos); 
    } else 
    Toast.makeText(context,"Unable to delete",Toast.LENGTH_SHORT).show(); 
    this.notifyItemRemoved(pos); 

    // Now simply call the remove function in onSwiped function as: 
    onSwiped(RecyclerView.ViewHolder viewHolder, int direction){ 
     adapter.remove(viewHolder.getAdapterPosition); 
     // Here adapter is the object of the adapter class made for recyclerview 
    } 
} 
0

私はあなたを助けたいが、あなたはより多くを説明し、自分の状況を表示するには、簡単なアニメーションGIFを投稿できますか? 可能であれば、あなたのアプリ内のすべてのステップとアクションを表示します(問題が発生した場所や断片)。 たとえば、Android Studioを使用してAndroidアプリのアニメーションGIFを作成できます(Android>モニター>スクリーンレコーダー>録画開始)。 何とかお手伝いできることを願っています。

+0

:としてその後、あなたのアダプタクラスでremove関数を作る

public boolean deleteAlarm(int id){ int result=db.delete(TABLE_ALARMS, KEY_ID + "=?", new String[] {String.valueof(id)}); if(result>0) return true; return false; } 

。私はデータベースにアラームを追加したとき(そして更新するとき)、アラームのKey値が更新されていないことを理解しました。私はキーを更新するプログラムを実装し、それは働いた –

関連する問題