6

Я пытаюсь добавить простой элемент «Просмотр» в элемент просмотра ресайклера, но по какой-то причине мне нужно дважды щелкнуть элемент, а не один раз, чтобы выполнить действие. При одном щелчке кажется, что recycler View не обнаруживает клика. На следующем, однако, он обнаруживает щелчок и выполняет подходящее действие.Двойной щелчок OnClickListener адаптера просмотра Recycler

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> 

КОД:

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

     } 

    } 

Я не мог найти проблему вот в результате чего этот вопрос. Могу ли я получить помощь по этому поводу. Благодарю.

+0

Здравствуйте, попробуйте следующее: itemView.setOnClickListener (this); –

+0

Спасибо. Я уже пробовал это. Но это не работает. В этом случае вид элемента представляет собой вид карты. Остальные компоненты были нарисованы над относительным расположением – Ahmed

+0

Хм, я не совсем уверен, как его решить: -/Возможно, onClickListener не является слушателем, которого вы ищете ... Попробуйте on-> ITEM <- ClickListener() Другим решением может быть: запись слушателя прямо за представлением xy.setOnItemClickListener (новый OnClickListener .../onItemClickListener ...) –

ответ

13

Так что я нашел проблему. Следующие две метки были виновниками здесь

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

Когда мы фокусирования и focusableInTouchMode = истина в основном это означает, что вы включаете вид на первый фокус на ощупь, а затем быть в состоянии нажать.

+0

Эй, у меня есть то же самое. Так же установил 'android: focusable =" true " android: focusableInTouchMode =" true "' to = "false"? - спасибо – user1446988

+0

Да. Это правильно – Ahmed

+0

Lmk, если это сработает для вас – Ahmed

3

У меня была аналогичная проблема, но решение настройки фокуса на false не помогло мне.

Вместо этого моя проблема заключалась в том, что я установил прослушиватель onItemTouch в действие, которое удерживало мое ресайклиру.

recyclerView.addOnItemTouchListener(...); 

Удалив это из своей деятельности, мои другие слушатели касания начали реагировать на отдельные краны и не только удваивать.

Смежные вопросы