2017-08-10 1 views
0

J'ai une cardview, avec quelques widgets, et une vue recycleur à l'intérieur de la vue de la carte. Le cardview est le parent.Android: Clicklistener sur parent ne fonctionne pas lorsque cliqué sur l'enfant

Je veux que ce soit quand on clique sur n'importe où dans le cardview, l'événement à se produire. Cependant, maintenant seulement quand la partie supérieure de la vue de carte est cliquée elle se déclenche, mais pas quand je clique sur la vue de recycleur.

J'ai essayé de définir le paramètre clickable dans la vue de recyclage sur false, et cela ne fonctionne pas.

Voici mon xml.

<android.support.v7.widget.CardView 
    xmlns:card_view="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/card_view_today" 
    android:layout_gravity="center" 
    android:layout_width="match_parent" 
    android:layout_margin="10dp" 
    android:layout_height="wrap_content" 
    card_view:cardCornerRadius="4dp" 
    android:padding="5dp" 
    android:clickable="true" 

    > 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:clickable="false" 
     android:orientation="vertical"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="40dp" 
     android:clickable="false" 
     android:gravity="center_vertical" 
     > 
     <ImageView 
      android:layout_width="20dp" 
      android:layout_marginLeft="5dp" 
      android:layout_height="20dp" 
      android:clickable="false" 
      android:src="@drawable/today_icon_small"/> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:clickable="false" 
      android:text="I still need to have today" 
      android:layout_margin="5dp"/> 

    </LinearLayout> 


    <android.support.v7.widget.RecyclerView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@+id/today_recycler_view_summary" 
     android:paddingLeft="20dp" 
     android:paddingRight="20dp" 
     android:clickable="false" 
     android:paddingBottom="10dp"> 

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

    </LinearLayout> 

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

Et voici le code de l'auditeur de clic que je fais sur l'activité oncreate():

todayCardView = (CardView) findViewById(R.id.card_view_today); 

todayCardView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Log.d(TAG, "Today card tapped"); 
      Intent intent = new Intent(MainActivity.this, TodayActivity.class); 
      startActivity(intent); 
     } 
    }); 

Comme requsted, voici mon porte-carte et vue, pour la vue recycleur, qui est dans la vue de la carte.

public class SummaryRecyclerViewAdapter extends RecyclerView.Adapter<SummaryRecyclerViewAdapter.ViewHolder> { 

String[] todaysItems; 

public SummaryRecyclerViewAdapter(String[] todaysItems) { 
    this.todaysItems = todaysItems; 
} 

@Override 
public SummaryRecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_view_chip,parent,false); 

    return new SummaryRecyclerViewAdapter.ViewHolder(view); 


} 

@Override 
public void onBindViewHolder(SummaryRecyclerViewAdapter.ViewHolder holder, int position) { 

    holder.textView.setText(todaysItems[position]); 

} 

@Override 
public int getItemCount() { 
    return todaysItems.length; 
} 

public static class ViewHolder extends RecyclerView.ViewHolder{ 

    public TextView textView; 

    public ViewHolder(View v){ 

     super(v); 

     textView = (TextView)v.findViewById(R.id.chip_text_view); 
    } 
} 

}

+2

Vous devriez montrer une utilisation plus de votre code Java. – UmarZaii

+0

poster votre ViewHolder –

+0

Vous pouvez gérer l'écouteur de clic sur la disposition linéaire au lieu de todayCardView. –

Répondre

0

Ajouter ce pour la vue recycleur .Cette veille à ce que le point de vue des enfants ne traitera pas l'événement tactile.

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    super.onTouchEvent(event); 
    return false; 
} 

Lisez cet article pour mieux comprendre le flux d'entrée tactile.

http://balpha.de/2013/07/android-development-what-i-wish-i-had-known-earlier/

+0

Où puis-je ajouter ceci? – RJB

+0

recyclerView.setOnTouchListener (nouveau View.OnTouchListener() { @Override OnTouch public boolean (Voir vue, MotionEvent MotionEvent) { return false;} }); – khetanrajesh

+0

Cela n'a pas fonctionné réellement. – RJB