2016-06-10 118 views
1

在片段我RecyclerVIewCardView在RecyclerView无法点击

我的动态容器:

我的片段:

<android.support.design.widget.AppBarLayout> 

    <android.support.v7.widget.Toolbar/> 

</android.support.design.widget.AppBarLayout> 

<android.support.v7.widget.RecyclerView 
    android:id="@+id/recycler_view" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_marginTop="?actionBarSize" 
    android:clipToPadding="false" 
    android:paddingBottom="8dp" 
    android:paddingLeft="8dp" /> 

我CardView:

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/card" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginRight="8dp" 
    android:layout_marginTop="8dp" 
    android:clickable="true" 
    android:foreground="?android:attr/selectableItemBackground" 
    app:cardCornerRadius="2dp" 
    app:cardElevation="2dp"> 

    ... 

</android.support.v7.widget.CardView> 

的OnClickListener:

holder.card.setOnClickListener(new View.OnClickListener() { 
    @Override public void onClick(View v) { 
     Log.d("click","click"); 
    } 
}); 

为什么cardview无法点击?我做错了什么?

+0

你确定问题是'CardView'本身吗?我的意思是,用另一种观点(例如'FrameLayout')是否有效? –

+0

您是否正确设置onClickListener? –

+0

holder.card.setOnClickListener(新View.OnClickListener(){ @覆盖 公共无效的onClick(视图v){ Log.d( “点击”, “点击”);} }); – gape

回答

0

RecyclerView与ListView有很大不同。这意味着设置OnClickListener必须以不同的方式完成!这是我如何做我的。

步骤1 - 创建一个类,您可以重用这样的:

public class RecyclerItemClickListener 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 RecyclerItemClickListener(Context context, final RecyclerView recyclerView, OnItemClickListener listener) 
    { 
     mListener = listener; 

     mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() 
     { 
     @Override 
     public boolean onSingleTapUp(MotionEvent e) 
     { 
      return true; 
     } 

     @Override 
     public void onLongPress(MotionEvent e){ 
      View childView = recyclerView.findChildViewUnder(e.getX(), e.getY()); 

      if(childView != null && mListener != null){ 
       mListener.onItemLongClick(childView, recyclerView.getChildAdapterPosition(childView)); 
      } 
     } 
     }); 
    } 

    @Override 
    public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) 
    { 
     View childView = view.findChildViewUnder(e.getX(), e.getY()); 

     if(childView != null && mListener != null && mGestureDetector.onTouchEvent(e)){ 
     mListener.onItemClick(childView, view.getChildAdapterPosition(childView)); 
     } 

     return false; 
    } 

    @Override 
    public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) {} 

    @Override 
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { 

    } 
} 

现在,你有这个类,你可以点击监听器只需连接到您的RecyclerView您的片段或活动这样的内:

mRecyclerView.addOnItemTouchListener(new RecyclerItemClickListener(this, mRecyclerView, new RecyclerItemClickListener 
      .OnItemClickListener() { 
     @Override 
     public void onItemClick(View view, int position) { 
      //handle click events here 
     } 

     @Override 
     public void onItemLongClick(View view, int position) { 
      //handle longClick if any 
     } 
    })); 

我希望这可以帮助你,因为我有一种感觉是无关这里CardView!祝你好运!