[英]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.