【问题标题】:adding swipe inside onBindViewHolder RecyclerView在 onBindViewHolder RecyclerView 中添加滑动
【发布时间】:2017-07-14 08:19:15
【问题描述】:

大家好,我尝试在 onBindViewHolder 中使用滑动,因为我的项目来自数据库,但我认为它似乎不起作用,因为我的应用程序崩溃了。我将这个自定义光标适配器用于我的 recyclerview https://gist.github.com/skyfishjy/443b7448f59be978bc59 这是我的代码。

@Override
public void onBindViewHolder(ItemViewHolder viewHolder, Cursor cursor) {
        mItems = cursor;
        final int     id      = cursor.getInt(cursor.getColumnIndex(MyDBHandler.COLUMN_ID));
        final String  title   = cursor.getString(cursor.getColumnIndex(MyDBHandler.COLUMN_TITLE_REMINDER));
        final String  desc    = cursor.getString(cursor.getColumnIndex(MyDBHandler.COLUMN_DESC_REMINDER));
        final String  date    = cursor.getString(cursor.getColumnIndex(MyDBHandler.COLUMN_DATE_REMINDER));

        viewHolder.title.setText(title);

        viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context, String.valueOf(id), Toast.LENGTH_SHORT).show();
            }
        });

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

            @Override
            public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) {
                int itemPosition = viewHolder.getAdapterPosition();
                notifyItemRemoved(itemPosition);
                dbHandler.deleteReminder(id);
            }
        };

        ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
        itemTouchHelper.attachToRecyclerView(this.myRecyclerview);
}

无论如何我可以通过滑动来关闭我在 recyclerview 中的项目吗?

【问题讨论】:

  • 请发布你的日志

标签: android android-recyclerview swipe


【解决方案1】:

从 onBindViewHolder 中删除以下代码块,并从您正在初始化适配器的位置添加您的活动或片段。

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

            @Override
            public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) {     // type cast your view holder
                // CusrsorViewHolder cViewHolder = (CursorViewHolder)viewHolder;
                int itemPosition = viewHolder.getAdapterPosition();
                notifyItemRemoved(itemPosition);
                dbHandler.deleteReminder(cViewHolder.id);
            }
        };

 ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
 itemTouchHelper.attachToRecyclerView(this.myRecyclerview);
 //put the above code before the following method in your activity or fragment
 //this.RecylerView.setAdapter(adapter)

在onBindViewHolder中设置你的id

@Override
public void onBindViewHolder(ItemViewHolder viewHolder, Cursor cursor) {
        mItems = cursor;
        final int     id      = cursor.getInt(cursor.getColumnIndex(MyDBHandler.COLUMN_ID));
        viewHolder.id = id;
}

【讨论】:

  • 但是我怎样才能获得 ID?感谢您的回复顺便说一句
  • @alvinvaldez 我已经编辑了我的答案,请检查并告诉我它是否对你有帮助
  • 它说无法解析符号“id”,这是我的代码:pastie.org/10519420
  • ItemViewHolder itemViewHolder = (ItemViewHolder)viewHolder; int itemPosition = itemViewHolder.getAdapterPosition();适配器.notifyItemRemoved(itemPosition); dbHandler.deleteReminder(itemViewHolder.id); @alvinvaldez 将此代码放入您的 onSwipe
  • ItemViewHolder itemViewHolder = (ItemViewHolder)viewHolder 为红色 我认为它在 MainActivity 内无法识别
【解决方案2】:

感谢@Waleed Sarwar 帮助我解决了这个问题。

我将https://gist.github.com/skyfishjy/443b7448f59be978bc59 用于我的recyclerviewcursoradapter。

MainActivity.java

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

        @Override
        public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) {
            RemindersAdapter.ItemViewHolder itemViewHolder = (RemindersAdapter.ItemViewHolder)viewHolder;
            int itemPosition = itemViewHolder.getAdapterPosition();
            adapter.notifyItemRemoved(itemPosition);
            // get the id of an item via itemViewHolder.id
            dbHandler.deleteReminder(itemViewHolder.id);

            // update cursor upon deleting do avoid
            // the card from coming back upon swipe
            adapter.swapCursor(dbHandler.getAllReminders());
        }
    };

    ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
    itemTouchHelper.attachToRecyclerView(listReminder);

RemindersAdapter.java

@Override
public void onBindViewHolder(ItemViewHolder viewHolder, Cursor cursor) {
    final int     id      = cursor.getInt(cursor.getColumnIndex(MyDBHandler.COLUMN_ID));
    final String  title   = cursor.getString(cursor.getColumnIndex(MyDBHandler.COLUMN_TITLE_REMINDER));
    final String  desc    = cursor.getString(cursor.getColumnIndex(MyDBHandler.COLUMN_DESC_REMINDER));
    final String  date    = cursor.getString(cursor.getColumnIndex(MyDBHandler.COLUMN_DATE_REMINDER));

    viewHolder.title.setText(title);

    // pass id to viewholder to get in swipe
    viewHolder.id = id;
}

public class ItemViewHolder extends RecyclerView.ViewHolder{
    public int id;
    TextView title;

    public ItemViewHolder(View itemView) {
            super(itemView);
            title = (TextView) itemView.findViewById(R.id.reminderTitle);
        }
}

我正在使用 adapter.swapCursor(dbHandler.getAllReminders());来自我的适配器,它是抽象类 CursorRecyclerViewAdapter 的一种方法,它使光标在删除时更新,因为没有它,被删除的项目将由 onBindViewHolder 重新创建。

【讨论】:

    【解决方案3】:

    使用以下代码从列表中删除该项目。 orderlist 是 RecyclerView 变量。

    SwipeDismissRecyclerViewTouchListener touchListener =
        new SwipeDismissRecyclerViewTouchListener(
                orderlist,
                new SwipeDismissRecyclerViewTouchListener.DismissCallbacks() {
                    @Override
                    public boolean canDismiss(int position) {
                        return true;
                    }
    
                    @Override
                    public void onDismiss(RecyclerView recyclerView, int[] reverseSortedPositions) {
                        for (int position : reverseSortedPositions) {
                            /*db.deleteOrderProduct(ordereditems.get(position).getOrder_pro_Code());
                            if(position>1){
                                listposition = position-1;
                            }*/
                            //ordereditems.remove(position);
                            //adapter.notifyItemRemoved(position);
                            //adapter.notifyDataSetChanged();
                            //displayOrderList();
                            DeleteOrderById(position);
    
                        }
                        adapter.notifyDataSetChanged();
                    }
                });
    orderlist.setOnTouchListener(touchListener);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-26
      • 1970-01-01
      • 1970-01-01
      • 2018-02-06
      • 2016-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多