2017-10-29 26 views
0

我有一个RecyclerView,它可以从SQLite数据库游标中获取数据,而不必将数据存储在ArrayList之前。RecyclerView + SQLite - 从数据库中删除行并调用.notifyItemRemoved在底部临时重新添加行

我尝试删除按钮上某个给定位置的一行,但立即重新添加RecyclerView底部的行。但是,当我关闭并重新打开活动时,条目已不存在(如我所愿)。另外当我尝试点击重新添加的条目时,我得到一个异常,所以它似乎不在那里了。

我GOOGLE了一段时间,但我无法找到答案。它与光标有关吗?从表中删除一行后,是否必须提供一个新的光标到适配器?如果是,如何?

这是我的代码:

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

谢谢。但我不使用CursorAdapter,所以我没有swapCursor方法。这个CursorAdapter仅适用于ListViews吗? 我试图通过一种方法提供一个新的游标,但它没有奏效。 –

+0

那是自定义回收站视图适配器吗? –

+0

是的。我尝试将mCursor设置为一个新的游标,但它没有奏效。我最初提供Cursor的方式是通过Adapter的构造函数。 –

相关问题