在不使用库的情况下轻扫(轻扫即可关闭)时,在recyclerview项下创建按钮和按钮单击 [英] Creating buttons and button click under recyclerview item when it swiped (swip to dismiss) without using library

查看:79
本文介绍了在不使用库的情况下轻扫(轻扫即可关闭)时,在recyclerview项下创建按钮和按钮单击的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用RecyclerView来显示我的列表.我使用ItemTouchHelper在RecyclerView上实现了Swipe消除功能.基础布局是通过使用画布在OnchildDraw方法中实现的. 现在我有一个问题:我想在图标上设置onclick.通过单击图标,我要执行一些功能. 这是我的课程:

I am using RecyclerView for showing my list. I implement Swipe to dismiss on the RecyclerView with ItemTouchHelper. The underlying layout is implemented in OnchildDraw method by using canvas. Now I have a problem: I want to set onclick on my icon. By clicking on the icon, I want to do some functions. Here is My class:

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.我现在想做的是在图标的单击上调用这些方法(在OnchildDraw中由画布绘制的图标) 我搜索了很多有关此主题的内容,并且在不使用任何库的情况下找不到实现该功能的任何解决方案. 我不想使用图书馆.

As you can see I am calling ItemRemoving or ItemSaving in OnSwiped method. What I want to do now is calling these methods on icons' click (icons that are drawn by canvas in OnchildDraw) I searched a lot about this topic and couldn't find any solution that implemented this feature without using any library. I don't want to use library.

推荐答案

我遇到了与您相同的问题.我编码了半天,终于找到了一种方法.

I had the same problem as yours. I coded half a day and finally find one way.

首先,我认为这是android ItemTouchHelper问题,没有解决方法.

First of all, I think this is android ItemTouchHelper problem that there are no methods to solve that.

因此它不能使用ItemTouchHelper和其他系统方法.

So it can't use ItemTouchHelper and other system methods.

我要做的是: 1.设置recylerView.setOnTouchListener以在屏幕上显示(x,y).

What I do is this: 1. Set recylerView.setOnTouchListener to get (x,y) on screen.

  1. 在ItemTouchHelper onSwiped()上,将其设置为状态并找到可点击的区域.

  1. When ItemTouchHelper onSwiped(), set it a state and find the clickable region.

检查触摸点是否碰到图标区域.

Check your touch point if it hits the icon region.

在onTouch()方法中被击中时执行某些操作.

Do something when hitted in your onTouch() method.

您可以在我的Github存储库中找到我的解决方案. https://github.com/TindleWei/WindGod

You can find my solution on my Github repo. https://github.com/TindleWei/WindGod

有3种使用ItemTouchHelper的方法:

Here 3 ways to use ItemTouchHelper:

  1. 像您一样的android正常方式

  1. android normal way like yours

前景和背景区域方式

viewpager方式

viewpager way

在我的仓库中,您可以查看第二种方式.

On my repo, you can look at 2nd way.

这篇关于在不使用库的情况下轻扫(轻扫即可关闭)时,在recyclerview项下创建按钮和按钮单击的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆