2015-05-17 16 views
3

Я использую макет CardView как Row для RecyclerView. Однако я сталкиваюсь с проблемой при установке OnClickListener в макет. Я использую следующую структуруПроблема с CardView и OnClickListener в RecyclerView

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:card_view="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/card_view" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_margin="@dimen/unit_5" 
    android:clickable="true" 
    android:longClickable="true" 
    card_view:cardCornerRadius="@dimen/unit_5"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="@dimen/spinnerWidth" 
     android:background="@drawable/row_item_background" 
     android:clickable="true" 
     android:orientation="vertical" 
     android:padding="@dimen/dialog_left_padding"> 

<!-- Other items --> 

     </LinearLayout> 

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

После мой адаптер и ViewHolder

private class SampleAdapter extends RecyclerView.Adapter<SampleViewHolder> { 
     ArrayList<Item> arrayList; 
     private LayoutInflater inflater; 

     public SampleAdapter(Context context) { 
      inflater = LayoutInflater.from(context); 
      this.arrayList = new ArrayList<>(); 
      arrayList.addAll(items); 
     } 

     @Override 
     public SampleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
      View view = inflater.inflate(R.layout.layout1, parent, false); 
      SampleViewHolder holder = new SampleViewHolder(view); 
      holder.setClickHandler(handler); 
      return holder; 
     } 

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

     } 

     @Override 
     public int getItemCount() { 
      return arrayList.size(); 
     } 

    } 

    static class SampleViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener { 
     TextView name; 
     IClickHandler clickHandler; 
     public IClickHandler getClickHandler() { 
      return clickHandler; 
     } 

     public void setClickHandler(IClickHandler clickHandler) { 
      this.clickHandler = clickHandler; 
     } 

     public SampleViewHolder(View itemView) { 
      super(itemView); 
      name = (TextView) itemView 
        .findViewById(R.id.name); 
      itemView.setOnClickListener(this); 
      itemView.setOnLongClickListener(this); 
     } 


     @Override 
     public void onClick(View view) { 
      if (getClickHandler() != null) { 
       getClickHandler().onItemClicked(view, getLayoutPosition()); 
      } 
     } 

     @Override 
     public boolean onLongClick(View view) { 
      if (getClickHandler() != null) { 
       getClickHandler().onItemLongClicked(view, getLayoutPosition()); 
      } 
      return true; 
     } 
    } 

Но это OnClick никогда не увольняют.

Однако, если я заменяю CardView на LinearLayout, все отлично работает. Я не уверен, в чем проблема. Может ли кто-нибудь помочь мне в этом?

Спасибо.

+0

сообщение полный адаптер и код, который используется для инициализации recyclerView и настройка слушателя. – theapache64

+0

Добавлен код. –

+0

Извините, это невозможно. – theapache64

ответ

5

Фактически реализация onClick очень проста, и я не уверен в реализации пользовательского обработчика кликов (IClickHandler).

Прежде всего Посмотреть держатель должен быть просто:

static class SampleViewHolder extends RecyclerView.ViewHolder { 
    TextView name; 

    public SampleViewHolder(View itemView) { 
    super(itemView); 
    name = (TextView) itemView.findViewById(R.id.name); 
    } 
} 

А потом в SampleAdapter

@Override 
public SampleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = inflater.inflate(R.layout.layout1, parent, false); 
    SampleViewHolder holder = new SampleViewHolder(view); 
    return holder; 
} 

@Override 
public void onBindViewHolder(SampleViewHolder holder, int position) { 
    final Item item = arrayList.get(position); 

    holder.name.setOnClickListener(new View.OnClickListener(){ 

     @Override 
     public void onClick(View view) { 
     //notice I implemented onClickListener here 
     // so I can associate this click with final Item item   
     } 

    }); 

} 
+1

да, это работает для меня! в дополнительном добавленном интерфейсе, и он отлично работает! –

0

Проблема была с тем, как макет был настроен для строки. Я сделал линейную компоновку как самый верхний элемент, таким образом делая вид карты своим ребенком, и все начало работать.

0

Я столкнулся с аналогичной проблемой. OnClick, похоже, не работает. Проблема заключалась в том, что корневой вид моего макета был Relative Layout ... Поэтому я изменил это на вид карты (и добавил в нее относительный макет), и он работал нормально.

0

Мой recyclerView внутри карты не ответил, когда я нажимаю,
Проблема была родительским тегом моего CardView была ScrollView. Другими словами, моя row_layout i.e CardView находилась внутри ScrollView. Так что я удалил ScrollView, это работает.

2

Совершенной Generic Solution

** Шаг 1: ** Перейти к XML, где cardview является placed.Assign это идентификатор

<android.support.v7.widget.CardView 
    android:id="@+id/cardView" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginBottom="@dimen/activity_vertical_margin" 
    app:cardCornerRadius="@dimen/activity_vertical_margin" 
    app:cardElevation="@dimen/activity_vertical_margin" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto"/> 

** Шаг 2: ** Внутреннего вида класса держателя получить удержание идентификатора карты

общественный класс View_Holder_For_Grocery расширяет RecyclerView.ViewHolder { CardView cv;

View_Holder_For_Grocery(View itemView) { 
    super(itemView); 
    cv = (CardView) itemView.findViewById(R.id.cardView); 
} 

}

** Шаг 3: ** Внутри Recycler_View_Adapter класс метод onBindViewHolder OnClick, как показано ниже

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

     holder.cv.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       switch (position){ 
        case 0: 
         Intent intent0=new Intent(v.getContext(),SunrayActivity.class); 
         v.getContext().startActivity(intent0); 
         break; 
        case 1: 
         Intent intent1=new Intent(v.getContext(),SunfeastActivity.class); 
         v.getContext().startActivity(intent1); 
         break; 
        case 2: 
         Intent intent2=new Intent(v.getContext(),SunriseActivity.class); 
         v.getContext().startActivity(intent2); 
         break; 

       } 

      } 
     }); 
    } 
Смежные вопросы