Add click listener to Generic RecyclerView Adapter

Edit

As this genericAdapter is not simple, and I know the methods of adding a click. And this is not a good practice for this in onCreateViewHolder . So why do I need a better offer

I created a Generic Adapter for RecyclerView in android . Now I need some suggestion to improve it. And how can I add clickListener to it.

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

And call it like

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

Now how and where can I add a click listener. Since adding clicks to onBindData is an overhead. Suggestion required.

+6
source share
4 answers

You tried to add a ViewHolder and add a clicklistener to it

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

And calling it like that

 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) { } }; } }; 
+4
source

You can add a listener to the action that you declared 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
source

I implemented ViewHolder in a Santa solution like this:

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

If you need ad it in context for constructor as parameter.

0
source

I created a generic adapter, aar and sources are in this URL :

this is a simple use:

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

add prefix (lambda sample)

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

See the URL link for details.

0
source

All Articles