使用RecyclerView在列表中滑动以删除

时间:2016-03-22 08:31:05

标签: android android-recyclerview swipe-gesture

我正在尝试在recyclerview中获取滑动到删除功能。我使用onSwiped()的{​​{1}}方法 当我使用ItemTouchHelper.SimpleCallback方法时,我得到了滑动动画,并且滑动的行会折叠。我检查了行数据从数据库中删除。但是,再次删除的行将重新生成并显示在同一位置的adapter.notifyItemRemoved()上。

recyclerview

看到其他一些SO问题,我尝试使用适配器 @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); } 方法,但这会停止该行的折叠动画,只留下一个空白行。 Blank row on swipe

我正在使用Loader从SQLite数据库加载适配器的游标。所以我也尝试调用.notifyItemRangeChanged()方法,但这也没有用。

你可以帮我解决这个问题。我已经尝试在Stack Overflow上搜索解决方案,但一直无法解决问题。

由于

3 个答案:

答案 0 :(得分:1)

我假设您list内有某种adapter数据。如果是,请删除已删除行的相应位置上的项目。

另外,请尝试拨打viewHolder.setIsRecyclable(false);

你的onSwiped应该看起来像这样:

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

根据您的评论,您使用的是this adapter?如果是这样,我认为您还需要致电swapCursorchangeCursor。你看过this question吗?

此外,在您的问题中,您还使用adapter.notifyItemRangeChangedadapter.notifyItemRemoved就足够了。

答案 1 :(得分:1)

使用

adapter.remove(viewHolder.getAdapterPosition());

@Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {

//删除你的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) );
        }
    }

答案 2 :(得分:0)

你可以在github上看到这个例子:

https://github.com/nemanja-kovacevic/recycler-view-swipe-to-delete