Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用RecyclerView在列表中滑动以删除_Android_Android Recyclerview_Swipe Gesture - Fatal编程技术网

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) );
        }
    }