Last active
February 13, 2019 16:30
-
-
Save Eng-MFQ/eea7b0a698d8d00a2b9f799665f350ba to your computer and use it in GitHub Desktop.
Helper class to add click Listener on RecyclerView items
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
// add this to res >values >ids.xml | |
// <resources> | |
// <item name="item_click_support" type="id"/> | |
// </resources> | |
public class RecyclerItemClickSupport { | |
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 RecyclerItemClickSupport(RecyclerView recyclerView) { | |
mRecyclerView = recyclerView; | |
mRecyclerView.setTag(R.id.item_click_support, this); | |
mRecyclerView.addOnChildAttachStateChangeListener(mAttachListener); | |
} | |
public static RecyclerItemClickSupport addTo(RecyclerView view) { | |
RecyclerItemClickSupport support = (RecyclerItemClickSupport) view.getTag(R.id.item_click_support); | |
if (support == null) { | |
support = new RecyclerItemClickSupport(view); | |
} | |
return support; | |
} | |
public static RecyclerItemClickSupport removeFrom(RecyclerView view) { | |
RecyclerItemClickSupport support = (RecyclerItemClickSupport) view.getTag(R.id.item_click_support); | |
if (support != null) { | |
support.detach(view); | |
} | |
return support; | |
} | |
public RecyclerItemClickSupport setOnItemClickListener(OnItemClickListener listener) { | |
mOnItemClickListener = listener; | |
return this; | |
} | |
public RecyclerItemClickSupport 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