0

我有一个关于 RecyclerView + Swipe 的问题,以便在小吃店的帮助下删除 + 撤消。每当我尝试快速滑动 3+ 项以删除它们时,viewHolder.getAdapterPosition();都会返回错误值。好像反应不那么快。

RecyclerView 列表示例:

  1. 测试1
  2. 测试2
  3. 测试3
  4. 测试4

因此,如果我快速扫开 Test3、Test2 然后 Test1viewHolder.getAdapterPosition();返回位置 2、2 和 0。正确的返回必须是 2、1 和 0。

对于两个项目,一切正常,返回 2,然后返回 1。

注意:最后一个位置总是在 2 秒后返回,因为snackbar 超时然后该项目被删除。一旦下一个项目被刷掉,之前显示的小吃店就会被关闭。

任何想法如何解决这个问题?我试图弄清楚几个小时。

ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) {
        @Override
        public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
            return false;
        }

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

            final int position = viewHolder.getAdapterPosition();

            FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
            rusure = Snackbar.make(fab, getResources().getString(R.string.rule_deleted), Snackbar.LENGTH_SHORT).addCallback(new Snackbar.Callback() {
                @Override
                public void onDismissed(Snackbar snackbar, int event) {

                    switch(event) {
                        case Snackbar.Callback.DISMISS_EVENT_ACTION:
                            rulesAdapter.notifyDataSetChanged();
                            break;
                        case Snackbar.Callback.DISMISS_EVENT_TIMEOUT:
                        case Snackbar.Callback.DISMISS_EVENT_CONSECUTIVE:
                        case Snackbar.Callback.DISMISS_EVENT_MANUAL:

                            Log.d("test", Integer.toString(position));
                            if(position!=-1 && position<arrayList.size()){

                                // Define 'where' part of query.
                                String selection = DatabaseTablesColums.FeedEntry._ID + " LIKE ?";
                                // Specify arguments in placeholder order.
                                String[] selectionArgs = {Integer.toString(arrayList.get(position).getId())};
                                // Issue SQL statement.


                                arrayList.remove(position);
                                rulesAdapter.notifyItemRemoved(position);
                                rulesAdapter.notifyItemRangeChanged(position, rulesAdapter.getItemCount());


                                db.delete(DatabaseTablesColums.FeedEntry.TABLE_NAME, selection, selectionArgs);
                                // Remove item from backing list here
                            }

                            break;
                    }
                }

                @Override
                public void onShown(Snackbar snackbar) {
                }
            }).setAction(getResources().getString(R.string.undo), new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                }
            });
            rusure.show();


        }
    });

    itemTouchHelper.attachToRecyclerView(recyclerView);
4

1 回答 1

1

看起来您正在从支持数据存储中删除该项目,在您的情况下,它arrayList只是在 SnackBar 关闭后才通知适配器。

因此,如果您在第一个 Snackbar 关闭之前滑动下一项,RecyclerView 适配器不知道第一项已从适配器中删除。所以它给了你一个错误的位置。

您应该从支持数据存储 (arrayList) 中删除该项目,并notifyItemRemoved()在您滑动该项目时立即调用,而不是在 Snackbar 关闭后更新。

不过,您只能在 SnackBar 关闭后更新数据库。

于 2017-08-03T11:40:34.980 回答