2016-06-02 12 views
2

私はImageViewを含むCardViewを持っています。 これで、onItemClickListenerを実装しました。 しかし、画像ビューでカバーされていないCardViewのスペースをクリックするだけで動作します。 イメージビューをクリックすると何も起こりません。RecyclerView:完全なCardViewにアクセスしていないsetOnClickListener

ImageViewをクリックしても、CardViewのonItemClickメソッドが呼び出される方法はありますか?

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:card_view="http://schemas.android.com/apk/res-auto" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 

     <android.support.v7.widget.CardView 
      android:id="@+id/card_view_maschine" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_gravity="center" 
      android:layout_margin="@dimen/card_margin" 
      android:elevation="6dp" 
      card_view:cardCornerRadius="@dimen/card_album_radius"> 

      <RelativeLayout 
       android:layout_width="match_parent" 
       android:layout_height="match_parent"> 

       <ImageView 
        android:id="@+id/thumbnail" 
        android:layout_width="match_parent" 
        android:layout_height="@dimen/maschine_cover_height" 
        android:background="?attr/selectableItemBackgroundBorderless" 
        android:clickable="true" 
        android:scaleType="fitXY" /> 

       <TextView 
        android:id="@+id/title" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:layout_below="@id/thumbnail" 
        android:paddingLeft="@dimen/maschine_title_padding" 
        android:paddingRight="@dimen/maschine_title_padding" 
        android:paddingTop="@dimen/maschine_title_padding" 
        android:textColor="@color/recyclerViewTitleColor" 
        android:textSize="@dimen/maschine_title" /> 

       <TextView 
        android:id="@+id/description" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:layout_below="@id/title" 
        android:paddingBottom="@dimen/description_count_padding_bottom" 
        android:paddingLeft="@dimen/maschine_title_padding" 
        android:paddingRight="@dimen/maschine_title_padding" 
        android:textSize="@dimen/description_count" /> 

       <ImageView 
        android:id="@+id/overflow" 
        android:layout_width="@dimen/ic_maschine_overflow_width" 
        android:layout_height="@dimen/ic_maschine_overflow_height" 
        android:layout_alignParentRight="true" 
        android:layout_below="@id/thumbnail" 
        android:layout_marginTop="@dimen/ic_maschine_overflow_margin_top" 
        android:scaleType="centerCrop" 
        android:src="@drawable/ic_dots" /> 

      </RelativeLayout> 

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

    </LinearLayout> 

OnItemClick:

ItemClickSupport.addTo(recyclerView).setOnItemClickListener(new ItemClickSupport.OnItemClickListener() { 
      @Override 
      public void onItemClicked(RecyclerView recyclerView, int position, View v) { 
       showDetailFragment(); 
      } 
     }); 

私はItemClickSupport classことを使用していました。

+0

アダプタ内でcardviewのクリックイベントを実行します。 –

+1

imageviewをclickabkeにしたくない場合は、android:clickable属性をfalseに設定します。今のところ、それがタッチイベントを受け取っている理由です。 –

+1

@TalhaMir属性をfalseに設定するとそのトリックが実行されました。 – jublikon

答えて

0

private ClickListener mClickListener; 


public interface ClickListener{ 
    void itemClicked(View view, int position); 
} 

のようなものが公共のセッターを作る、あなたのアダプタのインターフェイスを定義します。

public void setClickListener(ClickListener clickListener){ 
    this.mClickListener = clickListener; 
} 

、あなたのviewholderに:アダプターでのアクティビティで、その後

itemView.setOnClickListener(this); 

@Override 
public void onClick(View v) { 
    if(mClickListener!=null){ 
     mClickListener.mainMenuItemClicked(v, getAdapterPosition()); 
    } 
} 

を:

あなたは画像をクリックキャッチしたい場合

は、このビューにタグを設定し、活動には、ビューからタグを取得し、クリックした場所を確認することができます:onClickListener

imageView.setTag("image"); 
imageView.setOnClickListener(this); 

@Override 
public void itemClicked(View view, int position) { 
    if (view.getTag() != null && ((String)view.getTag()).equals("image")){ 
     //.... 
    } 
} 
0

ラップFrameLayout内のすべてのコンテンツと移動しますFrameLayoutに、clickabletrueに設定してください。

例:だからあなたの現在のレイアウトは次のようなものに見える場合:このようなFrameLayout

<LinearLayout> 
     <TextView/> 
     <ImageView/> 
    </LinearLayout> 

ラップ内容:

​​

をそしてあなたはFrameLayoutに持っている現在のonClickListenerを移動。

PS:前景android:foreground="?attr/selectableItemBackground"はクリック可能な領域に素晴らしい波紋効果を追加します。これはオプションです。

0

public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener { 

private OnItemClickListener mListener; 

public interface OnItemClickListener { 
    public void onItemClick(View view, int position); 
} 

GestureDetector mGestureDetector; 

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

} 

@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 rv, MotionEvent e) { 

} 

@Override 
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { 

} 

}

、あなたが

recyclerView.addOnItemTouchListener(new RecyclerItemClickListener(getActivity(), new RecyclerItemClickListener.OnItemClickListener() { 
     @Override 
     public void onItemClick(View view, int position) { 
      //your code here 
     } 
    })); 

希望確かにこの作品を以下のように、アプリケーション全体のためにそれを使用することができ、以下のクラスを追加します。

関連する問題