2017-10-29 2 views
0

私は、以前にArrayListにデータを格納せずにSQLite Database Cursorからデータを取得するRecyclerViewを持っています。RecyclerView + SQLite - データベースから行を削除し、.notifyItemRemovedを呼び出すと、一番下に行が一時的に再追加されます。

ボタンのクリックで指定された位置で行を削除しようとしましたが、すぐにRecyclerViewの下部に行が再追加されます。アクティビティを閉じて再度開くと、エントリは消えてしまいます(私が望むように)。また、私は再追加されたエントリをクリックしようとすると、私は例外を取得するので、もう存在しないようです。

私はしばらくの間googledが、私は答えを見つけることができませんでした。それはカーソルと関係がありますか?テーブルから行を削除した後、新しいカーソルをアダプタに提供する必要がありますか?はいの場合、どうですか?

これは私のコードです:

public MyViewHolder(View itemView, final RecyclerViewClickListener listener) { 
     super(itemView); 

     mDeleteImage = itemView.findViewById(R.id.image_delete); 

     [...] 

     mDeleteImage.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (listener != null) { 
        int position = getAdapterPosition(); 
        if (position != RecyclerView.NO_POSITION) { 
         listener.onDeleteClick(position); 
        } 
       } 
      } 
     }); 
    } 


@Override 
public void onDeleteClick(int position) { 
    SQLiteDatabase database = new MySQLiteHelper(this).getWritableDatabase(); 
    Cursor cursor = database.rawQuery("select * from " + MyContract.MyEntry.TABLE_NAME, null); 
    cursor.moveToPosition(position); 
    database.delete(MyContract.MyEntry.TABLE_NAME, MyContract.MyEntry._ID + "=?", new String[] {cursor.getString(cursor.getColumnIndexOrThrow(MyContract.MyEntry._ID))}); 
    mAdapter.notifyItemRemoved(position); 
} 

答えて

0

あなたがカーソルを更新する必要があると考えていると。はい、あなたがする必要がありますnotifyItemRemoved(position)ローカルリストからエントリを削除します。しかし、スクロールしようとすると、データはカーソルから取り出され、データはcursorに格納されます。

あなたのアダプタに最初にカーソルを設定している方法は、あなたがswapCursorchangeCursorメソッドを使用してnotifyDataSetChanged()を呼び出すことができますカーソルまたはを更新する必要があります同じ方法です。

RecyclerViewのカーソルの詳細については、thisをご覧ください。

ありがとうございました

+0

ありがとうございます。しかし、私は、私はswapCursorメソッドを持っていないので、CursorAdapterを使用しないでください。このCursorAdapterはListViewに対してのみ使用できますか? メソッドを使って新しいCursorを提供しようとしましたが、動作しませんでした。 –

+0

カスタムリサイクラビューアダプタですか? –

+0

はい。 mCursorを新しいCursorに設定しようとしましたが、動作しませんでした。カーソルがアダプタのコンストラクタを介して提供される方法です。 –

関連する問題