I set a button inside recyclerView where i click it Toast will show "RecyclerViewOnClick" not "Button inside RecyclerView".
If i want to show "Button inside RecyclerView",i have to click the button longClick.
How can i click the button inside recyclerView onClick ,and it will show "Button inside RecyclerView" not "RecyclerViewOnClick" ?
Any help would be greatly appreciated.
I use recyclerView click Model like this:
public class RecyclerViewClickListener implements RecyclerView.OnItemTouchListener {
private GestureDetector mGestureDetector;
private OnItemClickListener mListener;
public interface OnItemClickListener {
void onItemClick(View view, int position);
void onItemLongClick(View view, int position);
}
public RecyclerViewClickListener(Context context, final RecyclerView recyclerView, OnItemClickListener listener){
mListener = listener;
mGestureDetector = new GestureDetector(context,
new GestureDetector.SimpleOnGestureListener(){
@Override
public boolean onSingleTapUp(MotionEvent e) {
View childView = recyclerView.findChildViewUnder(e.getX(),e.getY());
if(childView != null && mListener != null){
mListener.onItemClick(childView,recyclerView.getChildLayoutPosition(childView));
return true;
}
return false;
}
@Override
public void onLongPress(MotionEvent e) {
View childView = recyclerView.findChildViewUnder(e.getX(),e.getY());
if(childView != null && mListener != null){
mListener.onItemLongClick(childView,recyclerView.getChildLayoutPosition(childView));
}
}
});
}
@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
if(mGestureDetector.onTouchEvent(e)){
return true;
}else
return false;
}
@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
}
My button inside recyclerView onClick function is under MyAdapter extends RecyclerView.Adapter:
public class MyViewHolder extends RecyclerView.ViewHolder{
private Button creditCardPayment;
public MyViewHolder(View itemView) {
super(itemView);
creditCardPayment=(Button)itemView.findViewById(R.id.creditCardPayment);
//I want to show this toast when i onClick button.
creditCardPayment.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(view.getContext(),"Button inside RecyclerView",Toast.LENGTH_SHORT).show();
}
});
}
It is my fragment declare recyclerView click model:
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
recyclerView.addOnItemTouchListener(new RecyclerViewClickListener(getActivity(),recyclerView, new RecyclerViewClickListener.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
//When i click the button , the toast show "RecyclerViewOnClick" not "Button //inside recyclerView"
Toast.makeText(getActivity(),"RecyclerViewOnClick",Toast.LENGTH_SHORT).show();
}
@Override
public void onItemLongClick(View view, int position) {
}
}));
}
It is my recyclerView layout, i set a button:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?android:attr/selectableItemBackground"
android:clickable="true"
android:orientation="horizontal">
<LinearLayout
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="10dp">
<TextView
android:id="@+id/paymentStatus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="8dp"
android:text="@string/paymentStatus"
android:textColor="@android:color/black"
android:textSize="18dp" />
//onClick over here
<Button
android:id="@+id/creditCardPayment"
android:layout_width="80dp"
android:layout_height="30dp"
android:layout_alignParentRight="true"
android:layout_gravity="center"
android:background="@drawable/corner_light_dark_blue"
android:text="@string/creditCardPayment"
android:textColor="@android:color/white" />
</LinearLayout>
</RelativeLayout>
As you have set TouchListener
to recylerview you never gonna have the onClick
event of the button at the same time. Button's OnClick
listener is fine but RecyclerView's OnTouchListener
is taking the precedence over the OnClick
listener of the Button.
So the best way to implement both is to set the whole item's click listener just like the Button's click listener.
Remove this
recyclerView.addOnItemTouchListener(new RecyclerViewClickListener(getActivity(),recyclerView, new RecyclerViewClickListener.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
//When i click the button , the toast show "RecyclerViewOnClick" not "Button //inside recyclerView"
Toast.makeText(getActivity(),"RecyclerViewOnClick",Toast.LENGTH_SHORT).show();
}
@Override
public void onItemLongClick(View view, int position) {
}
}));
Instead add this call on at the ViewHolder just like below.
public class MyViewHolder extends RecyclerView.ViewHolder{
private Button creditCardPayment;
public MyViewHolder(View itemView) {
super(itemView);
creditCardPayment=(Button)itemView.findViewById(R.id.creditCardPayment);
//I want to show this toast when i onClick button.
creditCardPayment.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(view.getContext(),"Button inside RecyclerView",Toast.LENGTH_SHORT).show();
}
});
//recyclerView's item click
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(getActivity(),"RecyclerViewOnClick",Toast.LENGTH_SHORT).show();
}
});
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.