在RecyclerView项被滑动(滑动以消除)时创建按钮并实现按钮点击,而不使用库。

9

我正在使用RecyclerView来显示我的列表。我使用ItemTouchHelper在RecyclerView上实现滑动删除。通过使用canvas在OnchildDraw方法中实现底层布局。 现在我有一个问题:我想在我的图标上设置onclick事件,通过点击图标,我想执行一些功能。 这是我的类:

public class ItemTouchHelperCallback : ItemTouchHelper.SimpleCallback
{
    private ContactSearchedResultAdapter _adapter;
    private RecyclerView _mRecyclerView;
    private int _swipeCount;
    private Android.Content.Res.Resources _resources;
    public ItemTouchHelperCallback(ContactSearchedResultAdapter adapter, RecyclerView mRecyclerView, Android.Content.Res.Resources resources)
        : base(0, ItemTouchHelper.Left | ItemTouchHelper.Right)
    {
        this._adapter = adapter;
        this._mRecyclerView = mRecyclerView;
        this._resources = resources;
    }
    public override bool OnMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target)
    {
        return false;
    }

    public override void OnSwiped(RecyclerView.ViewHolder viewHolder, int direction)
    {
        if (direction == ItemTouchHelper.Left)
        {
            _adapter.RemoveViewWithDialog(viewHolder.AdapterPosition, _mRecyclerView, _swipeCount);
            if (_swipeCount == 0)
                _swipeCount++;
        }
        else
        {
            _adapter.SaveContactToDataBase(viewHolder.AdapterPosition, _mRecyclerView);
        }
    }
    public override void OnChildDraw(Canvas cValue, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, bool isCurrentlyActive)
    {
        Paint paint = new Paint();
        View itemView = viewHolder.ItemView;
        float height = (float)itemView.Bottom - (float)itemView.Top;
        float width = height / 3;
        Bitmap icon;

        if (dX > 0)
        {
            paint.Color = Color.ParseColor("#388E3C");
            RectF background = new RectF((float)itemView.Left, (float)itemView.Top, dX, (float)itemView.Bottom);
            cValue.DrawRect(background, paint);
            icon = BitmapFactory.DecodeResource(_resources, Resource.Drawable.addoption);
            RectF icon_dest = new RectF((float)itemView.Left + width, (float)itemView.Top + width, (float)itemView.Left + 2 * width, (float)itemView.Bottom - width);
            cValue.DrawBitmap(icon, null, icon_dest, paint);
        }
        else
        {
            paint.Color = Color.ParseColor("#D32F2F");
            RectF background = new RectF((float)itemView.Right + dX, (float)itemView.Top, (float)itemView.Right, (float)itemView.Bottom);
            cValue.DrawRect(background, paint);
            icon = BitmapFactory.DecodeResource(_resources, Resource.Drawable.removeoption);
            RectF icon_dest = new RectF((float)itemView.Right - 2 * width, (float)itemView.Top + width, (float)itemView.Right - width, (float)itemView.Bottom - width);
            cValue.DrawBitmap(icon, null, icon_dest, paint);
        }

        float alpha = (float)1.0- Math.Abs(dX)/(float) itemView.Width;
        itemView.Alpha = alpha;
        itemView.TranslationX = dX;

        base.OnChildDraw(cValue, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
    }

}

你可以看到,在OnSwiped方法中我调用了ItemRemoving或ItemSaving。现在我想要的是在通过canvas绘制的图标点击时调用这些方法。

我搜索了很多关于此主题的内容,但没有找到任何不使用库实现此功能的解决方案。

我不想使用库。


对于那些想要使用库的人,请查看:https://dev59.com/AFcP5IYBdhLWcg3wAmKy#62182076 - h8pathak
2个回答

8
我遇到了和你一样的问题。我编码了半天,最终找到了一个方法。
首先,我认为这是安卓ItemTouchHelper的问题,因为没有方法可以解决它。
所以不能使用ItemTouchHelper和其他系统方法。
我做的是: 1.设置recylerView.setOnTouchListener来获取屏幕上的(x,y)。
2.当ItemTouchHelper onSwiped()时,设置它的状态并找到可点击区域。
3.检查您的触摸点是否命中图标区域。
4.在您的onTouch()方法中进行操作。
您可以在我的Github repo上找到我的解决方案。 https://github.com/TindleWei/WindGod 这里有三种使用ItemTouchHelper的方法:
1.像你的普通方式一样
2.前景和背景区域方式
3.viewpager方式
在我的repo上,您可以看到第二种方式。

你好。你的链接非常有帮助,即使已经过去了3年。谢谢你。但是你使用了rate变量,这使得图标在右滑和左滑时移动。我无法理解其中的数学部分,但我希望在滑动时图标保持固定位置。这里是我的当前代码,与你的类似。你能建议一些更改吗? - ansh sachdeva

2

如果您正在使用AdamWei的第二种解决方案,并且在片段中遇到recyclerview ontouchlistener的问题,请更改以下行:

Point point = new Point((int)motionEvent.getRawX(), (int)motionEvent.getRawY());

to

Point point = new Point((int) motionEvent.getX(), (int) motionEvent.getY());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接