简体   繁体   中英

Button inside recyclerView click unnormal

I set a button inside recyclerView where i click it Toast will show "RecyclerViewOnClick" not "Button inside RecyclerView".

If i want to show "Button inside RecyclerView",i have to click the button longClick.

How can i click the button inside recyclerView onClick ,and it will show "Button inside RecyclerView" not "RecyclerViewOnClick" ?

Any help would be greatly appreciated.

I use recyclerView click Model like this:

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

My button inside recyclerView onClick function is under MyAdapter extends 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();
                }
            });
        }

It is my fragment declare recyclerView click model:

    @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) {

                        }
                    }));
                }

It is my recyclerView layout, i set a button:

<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>

As you have set TouchListener to recylerview you never gonna have the onClick event of the button at the same time. Button's OnClick listener is fine but RecyclerView's OnTouchListener is taking the precedence over the OnClick listener of the Button.

So the best way to implement both is to set the whole item's click listener just like the Button's click listener.

Remove this

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) {

    }
}));

Instead add this call on at the ViewHolder just like below.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM