Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
357 views
in Technique[技术] by (71.8m points)

android - Creating buttons and button click under recyclerview item when it swiped (swip to dismiss) without using library

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);
    }

}

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.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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

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

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

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

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

  2. Check your touch point if it hits the icon region.

  3. Do something when hitted in your onTouch() method.

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

Here 3 ways to use ItemTouchHelper:

  1. android normal way like yours

  2. foregound and background region way

  3. viewpager way

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...