2016-06-02 15 views
2

Ich habe einen CardView ein Image enthält. Jetzt habe ich einen onItemClickListener implementiert. Aber es funktioniert nur, wenn ich auf das Feld der CardView klicke, das nicht von der Bildansicht abgedeckt wird. Wenn ich auf die Bildansicht klicke, passiert nichts.RecyclerView: setOnClickListener nicht den Zugriff auf vollständige CardView

Wie kann ich erreichen, dass der onItemClick Methode des CardView auch genannt wird, wenn ich auf dem Image klicken?

<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(); 
      } 
     }); 

Ich habe das ItemClickSupport class verwendet.

+0

führen in Ihrem Adapter cardview das Klick-Ereignis. –

+1

Wenn Sie nicht möchten, dass imageview clickabke wird, dann setzen Sie das Attribut android: clickable auf false. Im Moment ist es so, dass es Touch-Events empfängt. –

+1

@TalhaMir hat das Attribut auf false gesetzt. – jublikon

Antwort

0

definieren Schnittstelle in Ihrem Adapter, so etwas wie

private ClickListener mClickListener; 


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

machen öffentliche Setzer:

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

dann in Ihrem viewholder:

itemView.setOnClickListener(this); 

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

dann in Ihre Aktivitäten auf Adapter:

adapter.setClickListener(this); 

//and implement this interface 

public class MainActivity extends ActionBarActivity implements YourAdapter.ClickListener 

@Override 
public void itemClicked(View view, int position) { 
} 

, wenn Sie auf das Bild klicken fangen wollen und stellen Sie dann Tag zu dieser Ansicht und in der Aktivität können Sie Tag aus Sicht erhalten und sehen, wo geklickt:

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

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

Wrap alle Ihre Inhalte innerhalb eines FrameLayout und bewegen Sie den onClickListener an die FrameLayout und setzen clickable auf true.

Beispiel: Also, wenn Ihr aktuelles Layout sieht wie folgt aus etwas:

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

Wrap den Inhalt mit einem FrameLayout wie folgt aus:

<FrameLayout 
     android:foreground="?attr/selectableItemBackground" 
     android:clickable="true" 
     ... > 

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

    </FrameLayout> 

Und dann die aktuelle onClickListener bewegen Sie die FrameLayout haben .

PS: der Vordergrund android:foreground="?attr/selectableItemBackground" fügt einen netten Ripple-Effekt auf Ihren klickbaren Bereich, dies ist optional.

0

die unter Klasse

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) { 

} 

}

hinzufügen und Sie können es für gesamte Anwendung als

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

Hoffnung diese Arbeit sicher.

Verwandte Themen