在不使用库的情况下滑动(swip to dismiss)时,在recyclerview项目下创建按钮和按钮单击

时间:2016-08-07 06:24:41

标签: android xamarin.android android-recyclerview

我正在使用RecyclerView显示我的列表。我使用ItemTouchHelper实现Swipe以关闭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。我现在要做的是在图标上单击调用这些方法(在OnchildDraw中由画布绘制的图标) 我搜索了很多关于这个主题的内容,但没有使用任何库就找不到任何实现此功能的解决方案。 我不想使用库。

2 个答案:

答案 0 :(得分:4)

我和你的问题一样。我编码了半天,终于找到了一种方法。

首先,我认为这是Android的ItemTouchHelper问题,没有方法可以解决这个问题。

因此它无法使用ItemTouchHelper和其他系统方法。

我做的是这样的: 1.将recylerView.setOnTouchListener设置为在屏幕上获取(x,y)。

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

  2. 检查触摸点是否到达图标区域。

  3. 在onTouch()方法中执行某些操作。

  4. 您可以在我的Github回购中找到我的解决方案。 https://github.com/TindleWei/WindGod

    这里有3种使用ItemTouchHelper的方法:

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

    2. foregound和背景区域方式

    3. viewpager way

    4. 在我的回购中,你可以看看第二种方式。

答案 1 :(得分:1)

对于那些使用AdamWei解决方案编号2的用户,如果您在片段中使用recyclerview ontouchlistener时遇到问题,请更改以下行:

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

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