Last active
September 17, 2024 18:57
-
-
Save nesquena/231e356f372f214c4fe6 to your computer and use it in GitHub Desktop.
Click handling for RecyclerView
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0" encoding="utf-8"?> | |
<!-- Inside `res/values/ids.xml` --> | |
<!-- You also need to define R.id.item_click_support using ids.xml --> | |
<resources> | |
<item name="item_click_support" type="id" /> | |
</resources> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Source: http://www.littlerobots.nl/blog/Handle-Android-RecyclerView-Clicks/ | |
USAGE: | |
ItemClickSupport.addTo(mRecyclerView).setOnItemClickListener(new ItemClickSupport.OnItemClickListener() { | |
@Override | |
public void onItemClicked(RecyclerView recyclerView, int position, View v) { | |
// do it | |
} | |
}); | |
*/ | |
public class ItemClickSupport { | |
private final RecyclerView mRecyclerView; | |
private OnItemClickListener mOnItemClickListener; | |
private OnItemLongClickListener mOnItemLongClickListener; | |
private View.OnClickListener mOnClickListener = new View.OnClickListener() { | |
@Override | |
public void onClick(View v) { | |
if (mOnItemClickListener != null) { | |
RecyclerView.ViewHolder holder = mRecyclerView.getChildViewHolder(v); | |
mOnItemClickListener.onItemClicked(mRecyclerView, holder.getAdapterPosition(), v); | |
} | |
} | |
}; | |
private View.OnLongClickListener mOnLongClickListener = new View.OnLongClickListener() { | |
@Override | |
public boolean onLongClick(View v) { | |
if (mOnItemLongClickListener != null) { | |
RecyclerView.ViewHolder holder = mRecyclerView.getChildViewHolder(v); | |
return mOnItemLongClickListener.onItemLongClicked(mRecyclerView, holder.getAdapterPosition(), v); | |
} | |
return false; | |
} | |
}; | |
private RecyclerView.OnChildAttachStateChangeListener mAttachListener | |
= new RecyclerView.OnChildAttachStateChangeListener() { | |
@Override | |
public void onChildViewAttachedToWindow(View view) { | |
if (mOnItemClickListener != null) { | |
view.setOnClickListener(mOnClickListener); | |
} | |
if (mOnItemLongClickListener != null) { | |
view.setOnLongClickListener(mOnLongClickListener); | |
} | |
} | |
@Override | |
public void onChildViewDetachedFromWindow(View view) { | |
} | |
}; | |
private ItemClickSupport(RecyclerView recyclerView) { | |
mRecyclerView = recyclerView; | |
mRecyclerView.setTag(R.id.item_click_support, this); | |
mRecyclerView.addOnChildAttachStateChangeListener(mAttachListener); | |
} | |
public static ItemClickSupport addTo(RecyclerView view) { | |
ItemClickSupport support = (ItemClickSupport) view.getTag(R.id.item_click_support); | |
if (support == null) { | |
support = new ItemClickSupport(view); | |
} | |
return support; | |
} | |
public static ItemClickSupport removeFrom(RecyclerView view) { | |
ItemClickSupport support = (ItemClickSupport) view.getTag(R.id.item_click_support); | |
if (support != null) { | |
support.detach(view); | |
} | |
return support; | |
} | |
public ItemClickSupport setOnItemClickListener(OnItemClickListener listener) { | |
mOnItemClickListener = listener; | |
return this; | |
} | |
public ItemClickSupport setOnItemLongClickListener(OnItemLongClickListener listener) { | |
mOnItemLongClickListener = listener; | |
return this; | |
} | |
private void detach(RecyclerView view) { | |
view.removeOnChildAttachStateChangeListener(mAttachListener); | |
view.setTag(R.id.item_click_support, null); | |
} | |
public interface OnItemClickListener { | |
void onItemClicked(RecyclerView recyclerView, int position, View v); | |
} | |
public interface OnItemLongClickListener { | |
boolean onItemLongClicked(RecyclerView recyclerView, int position, View v); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Works like a charm. Thank you very much!