Reputation: 2554
I have an array of 600 items. I have put all the array items in a RecyclerView and they are scrolling well. But, when I try to access onClick listener it is not getting called. I also tried to Implement View.OnClickListener and Override onClick in my ViewHolder class, but its not working.
I want to Toast data of the clicked item in the list when user clicks one of the items in the view
Adapter code is
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
public static class ViewHolder extends RecyclerView.ViewHolder
implements View.OnClickListener {
private String mItem;
private TextView mTextView;
public ViewHolder(View view) {
super(view);
view.setOnClickListener(this);
mTextView = (TextView) view.findViewById(R.id.item_title);
}
public void setItem(String item) {
mItem = item;
mTextView.setText(item);
}
@Override
public void onClick(View view) {
Log.d("TAG", "onClick " + getPosition() + " " + mItem);
}
}
private String[] mDataset;
public MyAdapter(String[] dataset) {
mDataset = dataset;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item, parent, false);
ViewHolder vh = new ViewHolder(v);
return vh;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.setItem(mDataset[position]);
}
@Override
public int getItemCount() {
return mDataset.length;
}
}
Upvotes: 3
Views: 1221
Reputation: 802
You can implement your RecyclerView adapter this way to support for onItemCLick and OnItemLongClick
public class PersonAdapter extends RecyclerView.Adapter<PersonAdapter.ViewHolder>{
ArrayList<Person> data;
Context context;
HashMap<String, Integer> screenDetails;
private static ClickListener clickListener;
public interface ClickListener {
void onItemClick(int position, View v);
void onItemLongClick(int position, View v);
}
public void setOnItemClickListener(ClickListener clickListener) {
PersonAdapter.clickListener = clickListener;
}
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener{
public View view;
TextView full_name;
public ViewHolder(View v) {
super(v);
view = v;
full_name = (TextView)view.findViewById(R.id.first_name);
v.setOnClickListener(this);
v.setOnLongClickListener(this);
}
@Override
public void onClick(View v) {
clickListener.onItemClick(getAdapterPosition(), v);
}
@Override
public boolean onLongClick(View v) {
clickListener.onItemLongClick(getAdapterPosition(), v);
return false;
}
}
public PersonAdapter(Context context, ArrayList<Person> data) {
this.context = context;
this.data = data;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View cardView = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_chatroom_item, parent, false);
return new ViewHolder(cardView);
}
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
final Person person = data.get(position);
}
@Override
public int getItemCount() {
return data.size();
}
}
And in your activity implement it this way
PersonAdapter personAdapter = new PersonAdapter(getApplicationContext(),persons);
personAdapter.setOnItemClickListener(new PersonAdapter.ClickListener() {
@Override
public void onItemClick(int position, View v) {
}
@Override
public void onItemLongClick(int position, View v) {
}
});
recyclerView.setAdapter(PersonAdapter);
Upvotes: 0
Reputation: 602
public class MyAdapter extends RecyclerView.Adapter {
private final int VIEW_ITEM = 1;
private final int VIEW_PROG = 0;
private List<MyModel> list;
View v1;
RecyclerView.ViewHolder vh;
public MyAdapter(List<MyModel> lists) {
list = lists;
}
@Override
public int getItemViewType(int position) {
return list.get(position) != null ? VIEW_ITEM : VIEW_PROG;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
if (viewType == VIEW_ITEM) {
v1 = LayoutInflater.from(parent.getContext()).inflate(
R.layout.item, parent, false);
vh = new MyViewHolder(v1);
return vh;
}
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
if (holder instanceof MyViewHolder) {
final MyModel mymodel= (MyModel) list.get(position);
((MyViewHolder) holder).mTextView.setText(mymodel.getItem());
((MyViewHolder) holder).mTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("TAG", "onClick " + Integer.toString(position) + " " + mymodel.getItem());
}
});
}
}
@Override
public int getItemCount() {
return list.size();
}
public static class MyViewHolder extends RecyclerView.ViewHolder {
public TextView;
public MyViewHolder(View view) {
super(view);
mTextView = (TextView) view.findViewById(R.id.item_title);
}
}
}
// List Item Stored
public class MyModel extends Application implements Serializable {
private static final long serialVersionUID = 1L;
private String item,
public MyModel() {}
public MyModel(String itemtext) {
this.item = itemtext;
}
public String getItem() {return item;}
public void setItem(String id){ this.item = item;}
}
//use this code in main activity
List<MyModel> Listitem = new ArrayList<CarListGetterSetter>();
for(int i=0;i<600;i++){
Listitem.add(new MyModel("hi"+i);
}
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
recyclerView.setLayoutManager(new LinearLayoutManager(recyclerView.getContext()));
MyAdapter mAdapter = new MyAdapter(Listitem);
recyclerView.setAdapter(mAdapter);
Upvotes: 0
Reputation: 2727
Try this..
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
public static class ViewHolder extends RecyclerView.ViewHolder
{
private String mItem;
private TextView mTextView;
public ViewHolder(View view) {
super(view);
mTextView = (TextView) view.findViewById(R.id.item_title);
}
public void setItem(String item) {
mItem = item;
mTextView.setText(item);
}
private String[] mDataset;
Context context;
public MyAdapter(Context context,String[] dataset) {
this.context=context;
mDataset = dataset;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item, parent, false);
ViewHolder vh = new ViewHolder(v);
return vh;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.setOnClickListener(new ItemClicklistener(position);
holder.setItem(mDataset[position]);
}
@Override
public int getItemCount() {
return mDataset.length;
}
class ItemClicklistener implements View.OnClickListener {
private int position;
ItemClicklistener(int position) {
this.position = position;
}
@Override
public void onClick(View view) {
Toast.makeText(context,"OnClick :"+position,Toast.LENGTH_SHORT).show();
}
}
}
Upvotes: 3