I am in RecyclerView's Adapter.
From onBindViewHolder() I am able to perform onClick event for RecyclerView's row (ViewHolder's Item).
Is it possible to call onClick() by using Position ?
I am in RecyclerView's Adapter.
From onBindViewHolder() I am able to perform onClick event for RecyclerView's row (ViewHolder's Item).
Is it possible to call onClick() by using Position ?
You can do something like this
Adapter:
public class OffersAdapter extends RecyclerView.Adapter<OffersAdapter.ViewHolder> {
private List<Offer> mDataset;
private OffersListner mListener;
public OffersAdapter(List<Offer> response) {
mDataset = response;
}
public void setListener(OffersListner listener) {
mListener = listener;
}
@Override
public int getItemViewType(int position) {
return position;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_row_offers, parent, false);
return new ViewHolder(v);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
final int pos = getItemViewType(position);
holder.mLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mListener.onOfferChoice(mDataset.get(pos));
}
});
}
@Override
public int getItemCount() {
return mDataset.size();
}
public interface OffersListner {
void onOfferChoice(Offer offer);
}
public static class ViewHolder extends RecyclerView.ViewHolder {
@BindView(R.id.item_offers_layout)
LinearLayout mLayout;
public ViewHolder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
}
}
Activity:
public class OffersSelectActivity extends BaseEventActivity implements OffersAdapter.OffersListner {
.
.
.
private void setOffers(List<Offer> offers) {
OffersAdapter mAdapter = new OffersAdapter(offers);
mAdapter.setListener(this);
mOffers.setHasFixedSize(true);
mOffers.setLayoutManager(new LinearLayoutManager(this));
mOffers.setAdapter(mAdapter);
}
@Override
public void onOfferChoice(Offer offer) {
Intent intent = new Intent(this, OfferActivity.class);
intent.putExtra(Constants.EXTRA_OFFER_ID, offer.id);
intent.putExtra(Constants.EXTRA_OFFER_NAME, offer.name);
startActivity(intent);
}
}
Here is example :
public class NavigationDrawerAdapter extends RecyclerView.Adapter<NavigationDrawerAdapter.MyViewHolder> {
List<Pojo_menu> data;
public NavigationDrawerAdapter(Context mContext, List<Pojo_menu> data) {
this.data = data;
}
public class MyViewHolder extends RecyclerView.ViewHolder {
TextView title, tv_count;
RelativeLayout mRelativeLayout;
private SparseBooleanArray selectedItems = new SparseBooleanArray();
public MyViewHolder(View itemView) {
super(itemView);
title = (TextView) itemView.findViewById(R.id.item_name);
tv_count = (TextView) itemView.findViewById(R.id.tv_count);
mRelativeLayout = (RelativeLayout) itemView.findViewById(R.id.my_nav_menu);
}
}
public NavigationDrawerAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.nav_drawer_row, parent, false);
return new NavigationDrawerAdapter.MyViewHolder(itemView);
}
public void onBindViewHolder(NavigationDrawerAdapter.MyViewHolder holder, int position) {
Pojo_menu current = data.get(position);
String count = current.getCount();
holder.tv_count.setText(count);
holder.title.setText(current.getName());
holder.title.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
}
@Override
public int getItemCount() {
return data.size();
}
}
Just set onClickListener
to the holder
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.setOnClickListner(new View.OnClickListener() {
@Override
public void onClick(View view) {
// to the thing you want refer to the position by holder.getAdapterPosition()
}
};)
}
It not recommended to use position
directly since you have to declare it final
. Therefore, when referring to the position inside onClick
please use holder.getAdapterPosition()
instead.