【问题标题】:Android - show button after swiping recyclerview item [duplicate]Android - 刷recyclerview项目后显示按钮[重复]
【发布时间】:2017-03-06 21:57:18
【问题描述】:

我创建了包含CardViewRecyclerView 以显示数据。我想实现iOS 滑动列表元素样式以显示操作按钮。 我的方法应该允许我在向左滑动 RecyclerView 项目后显示图标:

public void initializeListeners() {
        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 direction) {
                int position = viewHolder.getAdapterPosition();

                if (direction == ItemTouchHelper.LEFT) {
                    Toast.makeText(getView().getContext(),"LEFT",Toast.LENGTH_LONG).show();
                }
            }

            @Override
            public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {

                Bitmap icon;
                if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {

                    View itemView = viewHolder.itemView;
                    float height = (float) itemView.getBottom() - (float) itemView.getTop();
                    float width = height / 3;

                   if (dX < 0) {
                        p.setColor(Color.parseColor("#D32F2F"));
                        RectF background = new RectF((float) itemView.getRight() + dX/4, (float) itemView.getTop(), (float) itemView.getRight(), (float) itemView.getBottom());
                        c.drawRect(background, p);
                        icon = BitmapFactory.decodeResource(getResources(), R.drawable.ic_delete_black_24dp);
                        RectF icon_dest = new RectF((float) itemView.getRight() - 2 * width, (float) itemView.getTop() + width, (float) itemView.getRight() - width, (float) itemView.getBottom() - width);
                        c.drawBitmap(icon, null, icon_dest, p);

                    }
                }
                super.onChildDraw(c, recyclerView, viewHolder, dX/4, dY, actionState, isCurrentlyActive);
            }
        };
        ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
        itemTouchHelper.attachToRecyclerView(binding.myPlans);

    }

这样做的效果是:

我想制作这个图标clickable,以便使用RecyclerView中点击位置对象的id发送HTTP请求(在alertview确认后)

有可能吗?我试图将Bitmap 替换为ImageButton,但没有成功

【问题讨论】:

  • 一种更简单的方法是操作 UI,在顶部添加一个 imageview,然后根据自己的喜好向右或向左移动。

标签: android android-recyclerview


【解决方案1】:

如果您考虑列表中的可滑动项目,Android 和 iOS 的逻辑会有些不同。在 Android 中,您无需单击确认删除。用户刷过该项目这一事实就足以确认。

这就是为什么ItemTouchHelper 不会为您提供附加OnClickListener 的方法。

你有两个选择:

  1. 您可以编写自己的自定义滑动管理系统(痛苦)。
  2. 同意 Android 的做法,并在滑动后要求用户确认。

【讨论】:

    【解决方案2】:

    我写了一篇博文,描述了实现此类功能所需的步骤。

    • 将以下类添加到您的项目中:SwipeRevealLayout.java
    • 调整 RecyclerView ViewHolder 的布局代码,并将 SwipeRevealLayout 组件添加为 RecyclerView 项的顶层和底层的容器。有关如何设置的示例:list_item_main.xml
    • 确保底层是 SwipeRevealLayout 容器中的第一个布局组件。
    • 确保为底层使用“wrap_content”或预定义宽度。我使用“match_parent”进行了测试,顶层做了一个很好的魔术然后消失了。
    • 如果要在底层添加可点击功能,请确保顶层有android:clickable=”true”,否则点击顶层时,底层组件的点击仍会触发。
    • 可选:您可以定义要从中拖动的边。默认情况下,它将从左侧拖动,在示例项目中我将其定义为从右侧拖动。在为 SwipeRevealLayout 组件指定属性时,使用app:dragFromEdge=”{edge to drag from}" 指定它。

    如果您有兴趣查看完整的博客文章,请在此处查看:https://android.jlelse.eu/android-recyclerview-swipeable-items-46a3c763498d

    【讨论】:

    【解决方案3】:

    绘制的背景是Canvas,Canvas不允许实现点击。

    我找到了一种方法来模拟在 RecyclerView.OnItemTouchListener 的 onInterceptTouchEvent 中单击垃圾箱视图。

    首先,在您的onBindViewHolder 中,您必须将视图的标签设置为 viewHolder :viewHolder.itemView.setTag(viewHolder)

    然后:

    @Override
    public void onInterceptTouchEvent (RecyclerView rv, MotionEvent e) {
        View viewSwipedRight = rv.findChildViewUnder(e.getX() - rv.getWidth(), e.getY());
        if (viewSwipedRight != null && e.getAction() == MotionEvent.ACTION_DOWN) {
            ViewHolder viewHolder = (ViewHolder) viewSwipedRight.getTag();
            if (e.getX() >= viewHolder.trashIcon.getX()) {
                // Your icon is clicked !
            }
        }
    }
    

    解释:

    当向左滑动时,您的视图仍在此处,但不在屏幕上,因为它已移动到 recyclerview 的左侧,因此View viewSwipedRight = rv.findChildViewUnder(e.getX() - rv.getWidth(), e.getY()); 将在您的 Y 单击屏幕上的 recyclerView 左侧找到视图(谢谢到e.getX() - rv.getWidth())。

    然后您查看事件 X 是否与您的垃圾箱图标的 X 在其自己的视图中与 e.getX() &gt;= viewHolder.trashIcon.getX() 匹配(您的垃圾箱图标必须在您的 viewHolder 中)。

    如果这两个条件都匹配,则您点击了垃圾桶图标。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多