2017-02-13 11 views
0

Ich stelle eine Schaltfläche in RecyclerView, wo ich es klicken Toast zeigt "RecyclerViewOnClick" nicht "Button in RecyclerView".Schaltfläche innerhalb RecyclerView klicken Sie auf unnormal

Wenn ich "Button in RecyclerView" anzeigen möchte, muss ich auf den Button longClick klicken.

Wie kann ich den Knopf innerhalb recyclerView onClick klicken, und es wird „Knopf im Inneren RecyclerView“ nicht „RecyclerViewOnClick“?

Jede Hilfe würde sehr geschätzt werden.

Ich benutze recyclerView Click-Modell wie folgt aus:

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

Meine Taste innerhalb recyclerView onClick Funktion unter MyAdapter ist erweitert 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(); 
       } 
      }); 
     } 

Es ist mein Fragment recyclerView Click-Modell erklären:

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

         } 
        })); 
       } 

Es ist mein RecyclerView-Layout, ich setze einen Knopf:

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

Nicht sicher, was das Problem ist. Wenn Sie wissen, woher der Toast angerufen wird, geben Sie einfach den Code ein, den Sie benötigen. – HaydenKai

+0

überprüfen Sie dieses Beispiel http://www.truiton.com/2015/02/android-recyclerview-tutorial/ –

+0

Danke für die Antwort, kann ich den Layout-Code gesetzt kann Sie verstehen, mein Problem, ich habe es aktualisiert. –

Antwort

2

Wie Sie TouchListener eingestellt haben Sie nie gonna haben die onClick-Ereignis der Schaltfläche zur gleichen Zeit recylerview. Button Listener ist in Ordnung, aber RecyclerView OnTouchListener hat Vorrang vor dem Listener des Button.

Die beste Möglichkeit, beides zu implementieren, besteht darin, den Klick-Listener des Elements genau wie den Klick-Listener des Elements festzulegen.

Entfernen dieser

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

    } 
})); 

Stattdessen fügen Sie diese wie unten in der ViewHolder anrufen.

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

danke @android_griezmann, du klärst mein Problem. Also, wenn ich eine Schaltfläche in RecyclerView habe, muss ich dieses RecyclerView-Modell beenden :( –

Verwandte Themen