Android 使用RecyclerView在列表中滑动以删除
我正在尝试在我的Android 使用RecyclerView在列表中滑动以删除,android,android-recyclerview,swipe-gesture,Android,Android Recyclerview,Swipe Gesture,我正在尝试在我的recyclerview中获得“刷卡删除”功能。我正在使用ItemTouchHelper.SimpleCallback的onsweep()方法 当我使用adapter.notifyItemRemoved()方法时,我得到了滑动动画,并且滑动的行折叠。我检查了从数据库中删除的行数据。但是,删除的行将再次重新生成并显示在recyclerview的相同位置 @Override public void onSwiped(RecyclerView.ViewHolder viewHo
recyclerview
中获得“刷卡删除”功能。我正在使用ItemTouchHelper.SimpleCallback的onsweep()
方法
当我使用adapter.notifyItemRemoved()
方法时,我得到了滑动动画,并且滑动的行折叠。我检查了从数据库中删除的行数据。但是,删除的行将再次重新生成并显示在recyclerview
的相同位置
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) {
ListOfItemsRecyclerViewCursorAdapter adapter = (ListOfItemsRecyclerViewCursorAdapter) rv.getAdapter();
int position = viewHolder.getAdapterPosition();
long itemIdToBeRemoved = rv.getAdapter().getItemId(position);
//Deletes the item from sqlite database
mDBManager.deleteItem(itemIdToBeRemoved);
adapter.notifyItemRemoved(position);
// Using notifyItemRangeChanged, the swiped row does not collapse, but stays as a blank row.
adapter.notifyItemRangeChanged(position, adapter.getItemCount());
//adapter.notifyDataSetChanged();
//Tried the following - but did not work
//getLoaderManager().initLoader(1, null, ListOfItemsFragment.this);
}
看到其他一些SO问题,我尝试使用adapter.notifyItemRangeChanged()
方法,但这停止了行的折叠动画,只留下一个空白行。
我正在使用加载程序从SQLite数据库加载适配器的游标。因此,我还尝试调用initloader()
方法,但也不起作用
你能帮我解决这个问题吗。我曾尝试寻找解决堆栈溢出的方法,但未能解决该问题
谢谢我假设您的适配器中有某种类型的数据列表
。如果是,则删除已删除行对应位置上的项目
另外,尝试调用viewHolder.setIsRecyclable(false)代码>
您的onsweed
应该是这样的:
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
// your original stuff here, db deletion etc.
// don't forget to delete the data inside the adapter
viewHolder.setIsRecyclable(false);
adapter.notifyItemRemoved(pos);
}
根据您的评论,您正在使用?如果是这样,我认为您还需要调用swapCursor
或changecoursor
。你看到了吗
另外,在您的问题中,您还使用了适配器。notifyItemRangeChanged
,适配器。notifyItemRemoved
应该足够了。使用
adapter.remove(viewHolder.getAdapterPosition())代码>
//删除你的da条目,然后
Toast.makeText(activity, message, Toast.LENGTH_SHORT).show();
adapter.remove(viewHolder.getAdapterPosition());
// if I emptied the entire list...draw background
if( adapter.getItemCount()==0 ){
SwipeRefreshLayout refresh = (SwipeRefreshLayout) activity.findViewById(R.id.container);
refresh.setBackground( ContextCompat.getDrawable(activity, R.drawable.background_null) );
}
}
您可以在github上看到这个示例:
如何填充您的RecyclerView
?我可以想象,您的数据仍然在已使用列表中。我正在使用一个自定义游标RecyclerView适配器,用SQLite数据库中的数据填充RecyclerView。使用加载器加载光标。是的,看起来数据集没有更新。我不明白是什么原因造成的。我在适配器中没有任何列表,我是从游标获取数据的。我以为notifyItemRemoved()是从适配器中删除该项。如何从光标中删除项目?我必须再次加载游标吗?@sofan游标本身没有数据,它只是指向数据库的指针。您是否尝试过setIsRecyclable
和notifyItemRemoved
?我确实尝试过。但我在刷卡时仍然得到一个空行。它不会使行折叠。我正在使用[链接]中的光标适配器。我想知道使用这个适配器是否需要做一些不同的事情。之前,我曾尝试在onLoadFinished()回调方法中使用swapCursor()。它没有起作用。但是,你提到了,我又调查了一遍。而且,我能够解决我的问题。我没有在适配器的子类中重写swapCursor()方法来交换包含游标的实例变量。为了加载更新后的游标,在从数据库中删除项之后,我在onsweep()方法中调用了加载程序的onContentChanged()方法。有趣的是,我不需要使用任何notifyItem…()方法。我希望这是解决问题的正确方法。感谢您的帮助。如何使用游标为适配器编写remove(int-position)方法?我还需要折叠动画,因此我想我也必须调用notifyItemRemoved()。我现在无法编辑属性“我的答案”,但在OnSwipe中,您必须对数据输入进行处理。动画仍将在那里
Toast.makeText(activity, message, Toast.LENGTH_SHORT).show();
adapter.remove(viewHolder.getAdapterPosition());
// if I emptied the entire list...draw background
if( adapter.getItemCount()==0 ){
SwipeRefreshLayout refresh = (SwipeRefreshLayout) activity.findViewById(R.id.container);
refresh.setBackground( ContextCompat.getDrawable(activity, R.drawable.background_null) );
}
}