簡體   English   中英

RecyclerView猛擊和物品點擊

[英]RecyclerView fling and item click

我有一個帶有項目網格的RecyclerView 單擊項目后,它會突出顯示。
我還希望當用戶向右滑動時調用“ next”方法,而當用戶向左滑動時調用“ previous”方法。
但是,由於彼此攔截對方的事件,因此兩者無法相互配合。
我如何讓他們一起工作?

這是我的代碼:

RecyclerView適配器

public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
    {
        myHolder = holder as MyView;
        myHolder.mMainView.SetOnClickListener(this);
        if (selected_position == position)
        {
            holder.ItemView.SetBackgroundColor(Color.LightGray);
        }
        else
        {
            holder.ItemView.SetBackgroundColor(Color.Transparent);
        }
   }

public void OnClick(View v)
    {
        int position = mRecyclerView.GetChildLayoutPosition((View)sender);

        // Updating old as well as new positions
        NotifyItemChanged(selected_position);
        selected_position = position;
        NotifyItemChanged(selected_position);
    }

包含RecyclerView的片段

calendarRecyclerView.SetOnTouchListener(this);

public bool OnTouch(View v, MotionEvent e)
    {
        switch (e.Action)
        {
            case MotionEventActions.Down:
                x1 = e.GetX();
                break;
            case MotionEventActions.Up:
                x2 = e.GetX();
                float deltaX = x2 - x1;
                if (Math.Abs(deltaX) > MIN_DISTANCE)
                {
                    // Left to Right swipe action
                    if (x2 > x1)
                    {
                        NextMonth();
                    }

                    // Right to left swipe action               
                    else
                    {
                        PreviousMonth();
                    }
                }


                break;
        }
        return false;
    }

因為我在OnTouch事件中將return false放入,所以將觸發該項目的click事件。 但是,MouseDown事件不會在OnTouch中觸發,從而避免了向后滑動檢測(因為x1始終為0)。

第一次單擊將調用OnTouch事件,而僅第二次單擊將調用OnClick事件

因為MotionEventActions.DownOnClick發生沖突。 作為一種解決方法,我建議您在MotionEventActions.Down事件中更改背景顏色。

  1. 創建自己的點擊監聽器
  2. 輕觸項目時,請致電聽眾。
  3. 偵聽器將回調到MainActivity以通知該項目已更改。
  4. 同時,觸摸事件將被調用。

我已經在OnTouchListener中設置了OnTouchListener:

public class MyViewHolder:RecyclerView.ViewHolder,IOnTouchListener
{
    private TextView textView;
    private MyItemClickListener mListener;
    private Context myContext;
    float x1 = 0;
    float x2 = 0;
    public TextView TextView { get { return textView; } }
    public MyViewHolder(View v, MyItemClickListener mItemClickListener) : base(v)
    {
        textView = v.FindViewById<TextView>(Resource.Id.itemText);
        mListener = mItemClickListener;
        v.SetOnTouchListener(this);
    }

    public MyViewHolder(View v, MyItemClickListener mItemClickListener, Context myContext) : this(v, mItemClickListener)
    {
        this.myContext = myContext;
    }
    public bool OnTouch(View v, MotionEvent e)
    {

        switch (e.Action)
        {
            case MotionEventActions.Down:
                x1 = e.GetX();
                if (mListener != null)
                {
                    mListener.OnItemClick(v, Position);
                }
                break;
            case MotionEventActions.Up:
                x2 = e.GetX();
                float deltaX = x2 - x1;
                if (Math.Abs(deltaX) > 5)
                {
                    // Left to Right swipe action
                    if (x2 > x1)
                    {
                        NextMonth(v);
                    }

                    // Right to left swipe action               
                    else
                    {
                        PreviousMonth(v);
                    }
                }
                break;
        }
        return true;           
    }

    public Boolean NextMonth(View v)
    {
        Toast.MakeText(myContext, "NextMonth called", ToastLength.Short).Show();      
        return true;
    }

    public Boolean PreviousMonth(View v)
    {
        Toast.MakeText(myContext, "PreviousMonth called", ToastLength.Short).Show();
        return true;
    }
}

定義了點擊界面:

public interface MyItemClickListener
{
    void OnItemClick(View view, int postion);
}

MainActivity設置點擊回調以更改背景顏色:

  public class MainActivity : Activity,MyItemClickListener
    { 
        RecyclerView mRecyclerView;
        RecyclerView.LayoutManager mLayoutManager;
        CustomAdapter mAdapter;
        string[] dataSet;
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            InitDataSet();
            SetContentView(Resource.Layout.Main);

            mLayoutManager = new LinearLayoutManager(this);

            mRecyclerView = FindViewById<RecyclerView>(Resource.Id.recyclerView);
            mRecyclerView.SetLayoutManager(mLayoutManager);
            mAdapter = new CustomAdapter(dataSet,this);
            mAdapter.setOnItemClickListener(this);
            mRecyclerView.SetAdapter(mAdapter);

            //mRecyclerView.SetOnTouchListener(this);
        }

        public void InitDataSet()
        {
            dataSet = new string[60];
            for (int i = 0; i < 60; i++)
            {
                dataSet[i] = "This is element #" + i;
            }
        }

        public void OnItemClick(View view, int postion)
        {
            mAdapter.NotifyItemChanged(CustomAdapter.selected_position);
            CustomAdapter.selected_position = postion;
            mAdapter.NotifyItemChanged(postion);
        }
     }
   }

注意:保持手指快速移動,如果速度足夠慢,則不會調用MotionEventActions.Down

Github源代碼

屏幕截圖:

在此處輸入圖片說明

在您的onClick中嘗試

    public void OnClick(View v)
        {
            int position = mRecyclerView.GetChildLayoutPosition((View)sender);
            int oldPosition = selectedPosition;
            selected_position = position;
            // Updating old as well as new positions
            NotifyItemChanged(oldPosition);

            NotifyItemChanged(selected_position);
        }

請注意,您必須在更新兩個項目之前更改所選位置

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM