[英]Button inside recyclerView click unnormal
我在recyclerView内设置了一个按钮,然后在其中单击Toast将显示“ RecyclerViewOnClick”而不是“ RecyclerView内的按钮”。
如果我想显示“ RecyclerView内部的按钮”,我必须单击按钮longClick。
我如何单击recyclerView onClick内的按钮,它将显示“ RecyclerView内的按钮”而不是“ RecyclerViewOnClick”?
任何帮助将不胜感激。
我使用recyclerView单击“模型”,如下所示:
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) {
}
}
我的recyclerView onClick函数内部的按钮位于MyAdapter下,扩展了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();
}
});
}
这是我的片段声明recyclerView点击模型:
@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) {
}
}));
}
这是我的recyclerView布局,我设置了一个按钮:
<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>
将TouchListener
设置为recylerview时,您将永远不会同时拥有按钮的onClick
事件。 Button的OnClick
侦听器很好,但是RecyclerView的OnTouchListener
优先于Button的OnClick
侦听器。
因此,实现这两种方法的最佳方法是设置整个项目的Click侦听器,就像Button的click侦听器一样。
删除这个
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) {
}
}));
而是像下面这样在ViewHolder上添加此调用。
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();
}
});
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.