Android-滑动recyclerview项后显示按钮

Android-滑动recyclerview项后显示按钮,android,android-recyclerview,Android,Android Recyclerview,我创建了RecyclerView,其中包含cardwiew,以显示数据。我想实现iOS风格的滑动列表元素来显示操作按钮。 我的方法应允许我在向左滑动RecyclerView项目后显示图标: public void initializeListeners() { ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.

我创建了
RecyclerView
,其中包含
cardwiew
,以显示数据。我想实现
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);

    }
public void initializeListeners(){
ItemTouchHelper.SimpleCallback simpleItemTouchCallback=新建ItemTouchHelper.SimpleCallback(0,ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT){
@凌驾
公共布尔onMove(RecyclerView RecyclerView、RecyclerView.ViewHolder ViewHolder、RecyclerView.ViewHolder目标){
返回false;
}
@凌驾
公共空间(RecyclerView.ViewHolder ViewHolder,int方向){
int position=viewHolder.getAdapterPosition();
if(direction==ItemTouchHelper.LEFT){
Toast.makeText(getView().getContext(),“左”,Toast.LENGTH_LONG.show();
}
}
@凌驾
public void onChildraw(画布c、RecyclerView RecyclerView、RecyclerView.ViewHolder ViewHolder、float dX、float dY、int actionState、boolean isCurrentlyActive){
位图图标;
如果(actionState==ItemTouchHelper.ACTION\u STATE\u SWIPE){
View itemView=viewHolder.itemView;
浮动高度=(float)itemView.getBottom()-(float)itemView.getTop();
浮动宽度=高度/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(背景,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(图标,null,图标,p);
}
}
super.onchildraw(c、recyclerView、viewHolder、dX/4、dY、actionState、isCurrentlyActive);
}
};
ItemTouchHelper ItemTouchHelper=新的ItemTouchHelper(simpleItemTouchCallback);
itemTouchHelper.attachToRecyclerView(binding.myPlans);
}
其影响是:

我想使此图标
可单击
,以便使用
recyclererview
中单击的对象的
id
发送
HTTP
请求(在alertview确认后)


可能吗?我试图替换<代码>位图 <代码> IGEPutux没有成功的

如果你考虑列表中的可搜索项,则Android和iOS的逻辑有点不同。在Android中,你不需要点击确认删除。用户刷卡该物品的事实足以证明这一点

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

你有两个选择:

  • 您可以编写自己的自定义刷卡管理系统(痛苦)
  • 同意Android这样做,并在刷卡后要求用户确认

  • 绘制的背景是画布,画布不允许执行单击

    我找到了一种方法,可以在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())
    将在recyclerView on屏幕左侧的Y单击处找到视图(多亏了
    e.getX()-rv.getWidth()

    然后使用
    e.getX()>=viewHolder.trashIcon.getX()
    (您的trashIcon必须位于您的viewHolder中)查看事件X是否与垃圾箱图标在其自身视图中的X匹配


    如果这两个条件都匹配,那么您已经单击了垃圾箱图标。

    我写了一篇博客文章,描述了实现这种功能所需的步骤

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

    如果您有兴趣查看完整的博客文章,请在此处查看:

    一个更简单的方法是操作UI,在顶部添加一个imageview,然后根据您的喜好向右或向左移动。请在cla中解决此关键问题