Reputation: 19415
I have a RecyclerView
Adapter. I have other RecyclerView
Adapters too and they are being clicked with no issue. However, when I click one of the RecyclerView
items the toast message doesn't show up. Why?
public class AttendanceAdapter extends RecyclerView.Adapter {
//...
//other overridden factory methods of RecyclerView Adapter and //Constructors and data setting Methods
//...
public class AttendanceListViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView rollNo, name;
ImageView isPreset;
public AttendanceListViewHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(this);
// ...
// Layout Items initialization
// ...
}
@Override
public void onClick(View v) {
Toast.makeText(mContext,"reyclerViewClicked",Toast.LENGTH_LONG).show();
}
}
}
EDIT :
My itemView XML looks like this ..
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="10dp"
android:orientation="horizontal">
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="10"
android:padding="5dp">
<TextView
android:id="@+id/roll_no_in_attendance_single_item"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_gravity="center"
android:layout_weight="2"
android:textColor="@color/colorTeal"
android:textSize="18sp"
android:gravity="center"
android:fontFamily="sans-serif-condensed"
android:text="1" />
<TextView
android:id="@+id/name_in_attendance_single_item"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_gravity="center"
android:layout_weight="6"
android:textColor="@color/colorTeal"
android:textSize="18sp"
android:gravity="center"
android:fontFamily="sans-serif-condensed"
android:text="1" />
<ImageView
android:layout_margin="10dp"
android:id="@+id/present_or_absent_toggle_in_attendance_single_item"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:src="@mipmap/ic_check_circle_black_24dp"
android:tint="@color/colorTeal"
android:layout_weight="2"
android:text="1" />
</LinearLayout>
</ScrollView>
</android.support.v7.widget.CardView>
Upvotes: 1
Views: 244
Reputation: 19415
Solved : I made a mistake (unknowingly) using ScrollView inside each item ,
One must not use Scroll View into
RecyclerView
item, because
RecyclerView
Scrolls Itself.
Upvotes: 3
Reputation: 1106
Lets say you have an item_view.xml
file. And your main layout is LinearLayout
. Just define an id for it.
public class AttendanceListViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
LinearLayout rootView;
TextView rollNo, name;
ImageView isPreset;
public AttendanceListViewHolder(View itemView) {
super(itemView);
rootView = (LinearLayout)itemView.findViewById(R.id.root_view);
rootView.setClickable(true);
rootView.setOnClickListener(this);
// ...
// Layout Items initialization
// ...
}
@Override
public void onClick(View v) {
Toast.makeText(mContext,"reyclerViewClicked",Toast.LENGTH_LONG).show();
}
}
Upvotes: 0
Reputation: 1553
Try implementing by below method create utility class for RecyclerView
item click.
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);
}
}
use it like this in your activity
or fragment
.
ItemClickSupport.addTo(mRecyclerView).setOnItemClickListener(new ItemClickSupport.OnItemClickListener() {
@Override
public void onItemClicked(RecyclerView recyclerView, int position, View v) {
// your code here
Toast.makeText(mContext,"reyclerViewClicked",Toast.LENGTH_LONG).show();
}
});
As shown in this blog.
Upvotes: 0