6

EditДобавить щелчок слушатель Generic RecyclerView адаптер

Как Это genericAdapter не просто один, и я знаю методы для добавления клика слушателя. И это не очень хорошая практика сделать это в onCreateViewHolder. Так вот почему мне нужно лучшее предложение

Я создал Generic адаптер для RecyclerView в android. Теперь мне нужно какое-то предложение улучшить его. И как я могу добавить к нему clickListener.

GenericAdapter.java

public abstract class GenericAdapter<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

    private Context context; 
    private ArrayList<T> items; 
    private OnRecyclerItemClicked onRecyclerItemClicked; 

    public abstract RecyclerView.ViewHolder setViewHolder(ViewGroup parent); 

    public abstract void onBindData(RecyclerView.ViewHolder holder, T val); 

    public GenericAdapter(Context context, ArrayList<T> items){ 
     this.context = context; 
     this.items = items; 
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     RecyclerView.ViewHolder holder = setViewHolder(parent); 
     return holder; 
    } 

    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
     onBindData(holder,items.get(position)); 
    } 

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

    public void addItems(ArrayList<T> savedCardItemz){ 
     items = savedCardItemz; 
     this.notifyDataSetChanged(); 
    } 

    public T getItem(int position){ 
     return items.get(position); 
    } 

    public void setOnRecyclerItemClicked(OnRecyclerItemClicked onRecyclerItemClicked){ 
     this.onRecyclerItemClicked = onRecyclerItemClicked; 
    } 

    public interface OnRecyclerItemClicked{ 
     void onItemClicked(View view,int position); 
    } 
} 

И Называйте это как

adapter = new GenericAdapter<MyModelClass>(context,listOfModelClass) { 
       @Override 
       public RecyclerView.ViewHolder setViewHolder(ViewGroup parent) { 
        final View view = LayoutInflater.from(context).inflate(R.layout.item_recycler_view, parent, false); 
        AViewHolder viewHolder = new AViewHolder(context, view); 
        return viewHolder; 
       } 

       @Override 
       public void onBindData(RecyclerView.ViewHolder holder1, MyModelClass val) { 
         MyModelClass currentCard = val; 

         AViewHolder holder = (AViewHolder)holder1; 
         holder.cardNumber.setText(currentCard.getDisplayNumber()); 
         holder.cardHolderName.setText(currentCard.getCardHolderName()); 
       } 
      }; 
      mRecyclerView.setAdapter(adapter); 

Теперь, как и где я мог бы добавить щелчок слушателя. Поскольку добавление кликов к onBindData является накладными расходами. Требуется предложение.

+0

Возможный дубликат [RecyclerView onClick] (http: // stac koverflow.com/questions/24471109/recyclerview-onclick) –

+0

Один из способов, который я видел, - это ваш класс обладателя вида, который реализует 'View.OnClickListener' –

+0

. Соответственно: http://stackoverflow.com/questions/24471109/recyclerview-onclick – Sufian

ответ

4

Вы пробовали добавить ViewHolder и добавить к нему clicklistener

Теперь GenericAdapter.java.

public abstract class GenericAdapter<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

    private Context context; 
    private List<T> items; 
    private OnRecyclerItemClicked onRecyclerItemClicked; 

    public abstract RecyclerView.ViewHolder setViewHolder(ViewGroup parent , OnRecyclerItemClicked onRecyclerItemClicked); 

    public abstract void onBindData(RecyclerView.ViewHolder holder, T val); 

    public abstract OnRecyclerItemClicked onGetRecyclerItemClickListener(); 

    public GenericAdapter(Context context, List<T> items){ 
     this.context = context; 
     this.items = items; 
     onRecyclerItemClicked = onGetRecyclerItemClickListener(); 
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     RecyclerView.ViewHolder holder = setViewHolder(parent , onRecyclerItemClicked); 
     return holder; 
    } 

    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
     onBindData(holder,items.get(position)); 
    } 

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

    public void setItems(ArrayList<T> savedCardItemz){ 
     items = savedCardItemz; 
     this.notifyDataSetChanged(); 
    } 

    public T getItem(int position){ 
     return items.get(position); 
    } 

    public interface OnRecyclerItemClicked{ 
     void onItemClicked(View view,int position); 
    } 
} 

И называть его, как этот

GenericAdapter<CreditCardItemBO> adaptering = new GenericAdapter<CreditCardItemBO>(mContext,new ArrayList<CreditCardItemBO>()) { 
      @Override 
      public RecyclerView.ViewHolder setViewHolder(ViewGroup parent, OnRecyclerItemClicked onRecyclerItemClicked) { 
       final View view = LayoutInflater.from(mContext).inflate(R.layout.item_save_credit_card, parent, false); 
       CreditCardViewHolder viewHolder = new CreditCardViewHolder(mContext, view,onRecyclerItemClicked); 
       return viewHolder; 
      } 

      @Override 
      public void onBindData(RecyclerView.ViewHolder holder, CreditCardItemBO val) { 

      } 

      @Override 
      public OnRecyclerItemClicked onGetRecyclerItemClickListener() { 
       return new OnRecyclerItemClicked() { 
        @Override 
        public void onItemClicked(View view, int position) { 

        } 
       }; 
      } 
     }; 
+0

Разве это отсортировало вас? –

+0

Я очень благодарен вам за помощь @Santa. – Nepster

+2

Не могли бы вы также поделиться кодом для CreditCardViewHolder? – Lunatikul

0

Вы можете добавить слушателя в своей деятельности вы объявили о RecyclerView:

recyclerView.addOnItemTouchListener(new RecyclerTouchListener(this, recyclerView, 
    new RecyclerTouchListener.ClickListener() { 
     @Override 
     public void onClick(View view, int position) { 
       //Handle the action 
      } 
     } 

     @Override 
     public void onLongClick(View view, int position) { 

     } 

    })); 
+0

Я хочу, чтобы элемент click listener не был полностью recyclerView click – Nepster

+0

@Nepster нажал на прослушиватель только для определенных элементов ? Или для всех предметов? Вышеупомянутое решение для всех элементов, с 'int position', указывающим, какой элемент щелкнуть. – Sufian

+0

@Nepster вызывается при нажатии отдельных элементов. Если вы хотите прослушивать разные компоненты в элементе, вам нужно будет сделать это в методе onBindViewHolder адаптера. Метод в более раннем ответе также позволяет обрабатывать события в действии, а не в адаптере. –

0

Я реализованного ViewHolder в Санта-решения, как это:

public class EmployeeViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
    private TextView employeeName; 
    private BaseRecyclerAdapter.OnRecyclerItemClicked mOnRecyclerItemClicked; 

    public EmployeeViewHolder(View view, BaseRecyclerAdapter.OnRecyclerItemClicked onRecyclerItemClicked) { 
     super(view); 
     employeeName = (TextView) view.findViewById(R.id.employee_name); 
     mOnRecyclerItemClicked = onRecyclerItemClicked; 
     view.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View view) { 
     mOnRecyclerItemClicked.onItemClicked(view, getAdapterPosition()); 
    } 

    public TextView getEmployeeName() { 
     return employeeName; 
    } 
} 

Если вам нужно контекстное объявление его в конструктору в качестве параметра.

0

Я создал универсальный адаптер, AAR и источники в this url:

это простота использования:

RecyclerAdapter<Customer> mAdapter = new RecyclerAdapter(customerList, CustomerViewHolder.class); 

добавить присоединять слушатель (лямбда образец)

RecyclerItemClickListener.affectOnItemClick(mRecycler, (position, view1) -> { 
//action 
}); 

см Ссылка на url подробнее

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