簡體   English   中英

recyclerView中的按鈕單擊異常

[英]Button inside recyclerView click unnormal

我在recyclerView內設置了一個按鈕,然后在其中單擊Toast將顯示“ RecyclerViewOnClick”而不是“ RecyclerView內的按鈕”。

如果我想顯示“ RecyclerView內部的按鈕”,我必須單擊按鈕longClick。

我如何單擊recyclerView onClick內的按鈕,它將顯示“ RecyclerView內的按鈕”而不是“ RecyclerViewOnClick”?

任何幫助將不勝感激。

我使用recyclerView單擊“模型”,如下所示:

public class RecyclerViewClickListener implements RecyclerView.OnItemTouchListener {

    private GestureDetector mGestureDetector;
    private OnItemClickListener mListener;


    public interface OnItemClickListener {
        void onItemClick(View view, int position);

        void onItemLongClick(View view, int position);
    }

    public RecyclerViewClickListener(Context context, final RecyclerView recyclerView, OnItemClickListener listener){
        mListener = listener;
        mGestureDetector = new GestureDetector(context,
                new GestureDetector.SimpleOnGestureListener(){ 

                    @Override
                    public boolean onSingleTapUp(MotionEvent e) {
                        View childView = recyclerView.findChildViewUnder(e.getX(),e.getY());
                        if(childView != null && mListener != null){
                            mListener.onItemClick(childView,recyclerView.getChildLayoutPosition(childView));
                            return true;
                        }
                        return false;
                    }

                    @Override
                    public void onLongPress(MotionEvent e) {
                        View childView = recyclerView.findChildViewUnder(e.getX(),e.getY());
                        if(childView != null && mListener != null){
                            mListener.onItemLongClick(childView,recyclerView.getChildLayoutPosition(childView));
                        }
                    }
                });
    }
    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {

        if(mGestureDetector.onTouchEvent(e)){
            return true;

        }else
            return false;
    }

    @Override
    public void onTouchEvent(RecyclerView rv, MotionEvent e) {
    }

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
    }
}

我的recyclerView onClick函數內部的按鈕位於MyAdapter下,擴展了RecyclerView.Adapter:

public class MyViewHolder extends RecyclerView.ViewHolder{
        private Button creditCardPayment;
        public MyViewHolder(View itemView) {
            super(itemView);
            creditCardPayment=(Button)itemView.findViewById(R.id.creditCardPayment);
            //I want to show this toast when i onClick button.
            creditCardPayment.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Toast.makeText(view.getContext(),"Button inside RecyclerView",Toast.LENGTH_SHORT).show();
                }
            });
        }

這是我的片段聲明recyclerView點擊模型:

    @Override
                public void onActivityCreated(@Nullable Bundle savedInstanceState) {
                    super.onActivityCreated(savedInstanceState);

                    recyclerView.addOnItemTouchListener(new RecyclerViewClickListener(getActivity(),recyclerView, new RecyclerViewClickListener.OnItemClickListener() {
                        @Override
                        public void onItemClick(View view, int position) {
    //When i click the button , the toast show "RecyclerViewOnClick" not "Button //inside recyclerView"                    

Toast.makeText(getActivity(),"RecyclerViewOnClick",Toast.LENGTH_SHORT).show();
                        }

                        @Override
                        public void onItemLongClick(View view, int position) {

                        }
                    }));
                }

這是我的recyclerView布局,我設置了一個按鈕:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?android:attr/selectableItemBackground"
    android:clickable="true"
    android:orientation="horizontal">

    <LinearLayout
        android:layout_weight="1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="10dp">

        <TextView
            android:id="@+id/paymentStatus"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginTop="8dp"
            android:text="@string/paymentStatus"
            android:textColor="@android:color/black"
            android:textSize="18dp" />
        //onClick over here
        <Button
            android:id="@+id/creditCardPayment"
            android:layout_width="80dp"
            android:layout_height="30dp"
            android:layout_alignParentRight="true"
            android:layout_gravity="center"
            android:background="@drawable/corner_light_dark_blue"
            android:text="@string/creditCardPayment"
            android:textColor="@android:color/white" />

    </LinearLayout>

</RelativeLayout>

TouchListener設置為recylerview時,您將永遠不會同時擁有按鈕的onClick事件。 Button的OnClick偵聽器很好,但是RecyclerView的OnTouchListener優先於Button的OnClick偵聽器。

因此,實現這兩種方法的最佳方法是設置整個項目的Click偵聽器,就像Button的click偵聽器一樣。

刪除這個

recyclerView.addOnItemTouchListener(new RecyclerViewClickListener(getActivity(),recyclerView, new RecyclerViewClickListener.OnItemClickListener() {
    @Override
    public void onItemClick(View view, int position) {
        //When i click the button , the toast show "RecyclerViewOnClick" not "Button //inside recyclerView"                    

        Toast.makeText(getActivity(),"RecyclerViewOnClick",Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onItemLongClick(View view, int position) {

    }
}));

而是像下面這樣在ViewHolder上添加此調用。

public class MyViewHolder extends RecyclerView.ViewHolder{
    private Button creditCardPayment;
    public MyViewHolder(View itemView) {
        super(itemView);
        creditCardPayment=(Button)itemView.findViewById(R.id.creditCardPayment);
        //I want to show this toast when i onClick button.
        creditCardPayment.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(view.getContext(),"Button inside RecyclerView",Toast.LENGTH_SHORT).show();
            }
        });

        //recyclerView's item click
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(getActivity(),"RecyclerViewOnClick",Toast.LENGTH_SHORT).show();                    
            }
        });
    }

暫無
暫無

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

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