RecyclerView single click does not work, but double-click works

I am trying to get clicks on RecyclerView elements for which I use a callback mechanism. I created the OnItemClickListener interface and inside the user adapter, I wrote the logic for click detection using View.OnClickListener . But I get a callback in myActivity after double clicking on any item in the list. I donโ€™t understand what is going on here!

Code inside action:

 mAdapter = new AppAdapter(this, mAppList, new OnItemClickListener() { @Override public void onItemClick(View v, int position) { Toast.makeText(SelectAppActivity.this, "Hello", Toast.LENGTH_SHORT).show(); } }); recyclerview.setAdapter(mAdapter); 

Code for the interface:

 public interface OnItemClickListener { void onItemClick(View v, int position); } 

Code for user adapter:

 public class AppAdapter extends RecyclerView.Adapter<AppAdapter.ItemViewHolder> { List<App> mAppList; List<App> mFilterAppList; Activity context; OnItemClickListener onItemClickListener; public AppAdapter(Activity context, List<App> appList, OnItemClickListener onItemClickListener) { super(); this.context = context; this.mAppList = appList; this.mFilterAppList = appList; this.onItemClickListener = onItemClickListener; } @Override public ItemViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) { final View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_app_list, parent, false); final ItemViewHolder viewHolder = new ItemViewHolder(view); view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onItemClickListener.onItemClick(v,4); } }); return viewHolder; } @Override public void onAttachedToRecyclerView(RecyclerView recyclerView) { super.onAttachedToRecyclerView(recyclerView); } @Override public void onBindViewHolder(ItemViewHolder holder, int position) { final App app = mAppList.get(position); holder.name.setText(app.getmName()); holder.icon.setImageDrawable(app.getmAppIcon()); } @Override public int getItemCount() { return mAppList.size(); } public void setFilter(List<App> appList) { mAppList = new ArrayList<>(); mAppList.addAll(appList); notifyDataSetChanged(); } public static class ItemViewHolder extends RecyclerView.ViewHolder { public TextView name; public ImageView icon; public ItemViewHolder(View view) { super(view); name = (TextView) itemView.findViewById(R.id.app_name); icon = (ImageView) itemView.findViewById(R.id.app_icon); } } } 
+11
source share
9 answers

The problem was with the android: focusable = "true" in my layout, since I deleted it, it worked fine, all the suggested answers also work fine. Thank you all.

+10
source

There is also a known bug, for those of you who land here, check out this question that refers to this workaround .

+4
source

Add a Click-listener element to ItemViewHolder, it works great.

  public static class ItemViewHolder extends RecyclerView.ViewHolder { public TextView name; public ImageView icon; public ItemViewHolder(View view) { super(view); name = (TextView) itemView.findViewById(R.id.app_name); icon = (ImageView) itemView.findViewById(R.id.app_icon); view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //getLayoutPosition is a method of RecyclerView onItemClickListener.onItemClick(v,getLayoutPosition()); } }); } } 
+1
source

Just move your onClick to onBindViewHolder and set the click as shown below, Hope it solves your problem ....

 holder.icon.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onItemClickListener.onItemClick(v,4); } }); 
+1
source

Move your onClickListner from onCreateViewHolder to onBindViewHolder

  @Override public void onBindViewHolder(ItemViewHolder holder, int position) { final App app = mAppList.get(position); holder.name.setText(app.getmName()); holder.icon.setImageDrawable(app.getmAppIcon()); holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onItemClickListener.onItemClick(v , position); } }); } 
0
source

Add them to your parent in R.layout.item_app_list

 android:clickable="false" android:focusable="false" 
0
source

In my application, I really needed to leave android: focusable = "true", so instead of using clickListener, I use a focus listener:

  dataItemViewHolder.itemView.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if(hasFocus){ System.out.println("onFocusChange"); } } }); 

In my root view:

  android:focusable="true" android:focusableInTouchMode="true" android:clickable="true" 

You just need to know that you will lose the effects of clicks and animations.

0
source

In my case, I tried some of the solutions given, but I had no luck with that. After some searching, I tried the below thing and then it works fine.

XML

 <android.support.v7.widget.RecyclerView --------------------------- android:nestedScrollingEnabled="false" /> 

Program

recyclerView.setNestedScrollingEnabled(false);

0
source

if using RecyclerView in NestedScrollView add this line to RecyclerView:

 android:nestedScrollingEnabled="false" 

I hope this helps you.

0
source

All Articles