6

Ich versuche, eine einfache Click View zu einem Element einer Recycleransicht hinzuzufügen, aber aus irgendeinem Grund muss ich zweimal auf ein Element klicken, um eine Aktion auszuführen. Bei einem einzigen Klick scheint es, dass die Recycler-Ansicht keinen Klick erkennt. Auf der nächsten erkennt es jedoch den Klick und führt eine geeignete Aktion aus.Doppelklicken auf OnClickListener eines Recyclers View Adapter

XML:

<android.support.v7.widget.CardView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/cardView" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    > 

    <RelativeLayout 
     android:id="@+id/rlContainer" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:clickable="true" 
     android:focusable="true" 
     android:focusableInTouchMode="true" 
     android:background="@drawable/selector_inventory_recycler_item" 
     android:padding="16dp"> 

     <ImageView 
      android:id="@+id/item_photo" 
      android:layout_width="100dp" 
      android:layout_height="100dp" 
      android:layout_alignParentLeft="true" 
      android:layout_alignParentTop="true" 
      android:layout_marginRight="16dp" 
      /> 

     <TextView 
      android:id="@+id/txtItemName" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentTop="true" 
      android:layout_toRightOf="@+id/item_photo" 
      android:textSize="16sp" 
      /> 

     <TextView 
      android:id="@+id/txtItemQuantity" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_below="@+id/txtItemName" 

      android:layout_toRightOf="@+id/item_photo" 
      /> 

     <TextView 
      android:id="@+id/txtItemPrice" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_below="@+id/txtItemQuantity" 
      android:layout_toRightOf="@+id/item_photo" 
      /> 

    </RelativeLayout> 

</android.support.v7.widget.CardView> 

Code:

public class InventoryItemRecyclerAdapter extends RecyclerView.Adapter<InventoryItemRecyclerAdapter.InventoryItemViewHolder> { 


     onItemClickListener mOnItemClickListener = null; 

     /** 
     * 
     */ 
     public ArrayList<Product> mInventoryItemList; 

     Context mContext; 

     static String TAG = "InventoryItemRecyclerAdapter"; 

     Random random = new Random(); 

     // ------------------------------------------------------------------------- 
     // Constructor 

     /** 
     * 
     * @param pInventoryItemList 
     */ 
     public InventoryItemRecyclerAdapter(ArrayList<Product> pInventoryItemList) { 
      mInventoryItemList = pInventoryItemList; 
     } 

     // --------------------------------------------------------------------- 

    @Override 
    public InventoryItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

     mContext = parent.getContext(); 

     // Inflate the Layout for an item 
     View v = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.item_inventory_recycler_adapter, parent, false); 

     // Instantiate ViewHolder 
     InventoryItemViewHolder inventoryItemViewHolder = new InventoryItemViewHolder(v); 

     return inventoryItemViewHolder; 
    } 

     @Override 
     public void onBindViewHolder(InventoryItemViewHolder holder, int position) { 

      ... 
     } 

     // --------------------------------------------------------------------------------------------- 

     /** 
     * Returns the total number of items in the data set hold by the adapter. 
     * 
     * @return The total number of items in this adapter. 
     */ 
     @Override 
     public int getItemCount() { 
      return mInventoryItemList.size(); 
     } 

     // --------------------------------------------------------------------------------------------- 
     // View Holder 

     /** 
     * RecyclerView 
     */ 
     public class InventoryItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 

      // ----------------------------------------------------------------------------------------- 
      // Vars 

      public CardView cardView; 

      public RelativeLayout uiContainer; 

      public TextView productName; 
      public TextView productPrice; 
      public TextView productQuantity; 

      public ImageView productImage; 

      public Product mProduct; 

      // ----------------------------------------------------------------------------------------- 
      // Constructor 

      public InventoryItemViewHolder(View itemView) { 
       super(itemView); 

       cardView  = (CardView) itemView.findViewById(R.id.cardView); 
       productName  = (TextView) itemView.findViewById(R.id.txtItemName); 
       productImage = (ImageView) itemView.findViewById(R.id.item_photo); 
       productPrice = (TextView) itemView.findViewById(R.id.txtItemPrice); 
       productQuantity = (TextView) itemView.findViewById(R.id.txtItemQuantity); 
       uiContainer  = (RelativeLayout) itemView.findViewById(R.id.rlContainer); 

       uiContainer.setOnClickListener(this); 


      } 

      // ----------------------------------------------------------------------------------------- 

      /** 
      * Called when a view has been clicked. 
      * 
      * @param v The view that was clicked. 
      */ 
      @Override 
      public void onClick(View v) { 

       Log.e("InventoryItemRecyclerAdapter", "onItemClick"); 

       // Throw a null pointer exception if this is null 
       if (mOnItemClickListener == null) { 
        throw new NullPointerException("mOnItemClickListener is null in InventoryItemRecyclerAdapter"); 
       } 

       // Delegate to its caller. Let it handle the work 
       mOnItemClickListener.onRecyclerViewItemClick(this); 

      } 

      // ------------------------------------------------------------- 

     } 


     // ----------------------------------------------------------------- 
     /** 
     * Interface for RecyclerView 
     */ 
     public interface onItemClickListener { 

      /** 
      * 
      * @param pItemViewHolder 
      */ 
      public void onRecyclerViewItemClick(InventoryItemRecyclerAdapter.InventoryItemViewHolder pItemViewHolder); 

     } 

    } 

ich nicht das Problem das ist, was dieses Problem scheinen könnte zu finden. Kann ich bitte Hilfe bekommen? Vielen Dank.

+0

Hallo, versuchen Sie Folgendes: itemView.setOnClickListener (this); –

+0

Danke. Ich habe das schon probiert. Aber das funktioniert nicht. In diesem Fall ist die Artikelansicht eine Kartenansicht. Die restlichen Komponenten wurden über ein relatives Layout gezeichnet. – Ahmed

+0

Hmm, ich bin mir nicht sicher, wie ich es lösen soll: -/Vielleicht ist der onClickListener nicht der Listener, nach dem du suchst ... Probier es mit on-> ITEM <- ClickListener() Andere Lösung könnte sein: Schreibe den Listener direkt hinter der Ansicht xy.setOnItemClickListener (new OnClickListener .../onItemClickListener ...) –

Antwort

13

So fand ich das Problem. Die folgenden zwei Tags waren die Täter hier

android:focusable="true" 
android:focusableInTouchMode="true" 

Wenn wir fokussierbarem gesetzt und focusableInTouchMode = true im Grunde bedeutet es, dass Sie auf einem Touch einen Blick auf ersten Fokus ermöglichen und dann in der Lage sein zu klicken.

+0

Hey Ahemd Ich habe genau das gleiche Problem. Also habe ich 'android: focusable =" true "gesetzt android: focusableInTouchMode =" true "' to = "false"? - Danke – user1446988

+0

Ja. Das ist korrekt – Ahmed

+0

Lmk wenn das für dich funktioniert – Ahmed

3

Ich hatte ein ähnliches Problem, aber die Lösung der Einstellung fokussierbar auf falsch funktionierte in meinem Fall nicht.

Mein Problem war stattdessen, dass ich den onItemTouch-Listener in der Aktivität festgelegt hatte, die meine Recycler-Ansicht enthielt.

Durch das Entfernen dieser aus meiner Tätigkeit, meine anderen Touch-Listener auf einzelne Tippen zu reagieren und nicht nur zu verdoppeln.