6

Próbuję dodać prosty widok kliknięcia do elementu widoku recyklera, ale z jakiegoś powodu muszę dwukrotnie kliknąć element zamiast raz, aby wykonać działanie. Przy pojedynczym kliknięciu wygląda na to, że przeglądarka nie wykrywa kliknięcia. Na następnym jednak wykrywa kliknięcie i wykonuje odpowiednią akcję.Kliknij dwukrotnie ikonę OnClickListener adaptera widoku Recyklera

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> 

KOD:

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

     } 

    } 

nie mogę wydawać się znaleźć problem ów przyczyną tego problemu. Czy mogę uzyskać pomoc w tym zakresie? Dzięki.

+0

Witam, spróbuj tego: itemView.setOnClickListener (this); –

+0

Dzięki. Próbowałem już tego. Ale to nie działa. W tym przypadku widok elementu jest widokiem karty. Reszta składników została narysowana nad względnym układem – Ahmed

+0

Hmm, nie jestem pewien, jak to rozwiązać: -/Być może onClickListener nie jest słuchaczem, którego szukasz ... Spróbuj z -> ELEMENTEM <- ClickListener() Innym rozwiązaniem może być: zapisanie słuchacza bezpośrednio za widokiem xy.setOnItemClickListener (nowy OnClickListener .../onItemClickListener ...) –

Odpowiedz

13

Więc znalazłem problem. Poniższe dwa znaczniki były sprawcami tutaj

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

Kiedy ustawiony aktywowana i focusableInTouchMode = true zasadzie oznacza to, że jesteś umożliwiając widok na pierwszym naciskiem na dotyk, a następnie być w stanie kliknąć.

+0

Hej, Ahemd, mam dokładnie ten sam problem. Tak ustawiłem 'android: focusable =" true " android: focusableInTouchMode =" true "' to = "false"? - dzięki – user1446988

+0

Tak. To prawda, – Ahmed

+0

Lmk, jeśli to ci pomoże – Ahmed

3

Miałem podobny problem, ale rozwiązanie ustawienia fokusa na false nie działało w moim przypadku.

Zamiast tego, mój problem polegał na tym, że ustawiłem odbiornik onItemTouch w działaniu, które wstrzymywało mój widok recyklera.

recyclerView.addOnItemTouchListener(...); 

Usuwając to z mojej działalności, moi inni słuchacze dotykowe zaczął reagować na pojedyncze krany i nie tylko dwukrotnie.

Powiązane problemy