0

J'ai implémenté RecyclerView avec un adaptateur pour les éléments et chaque élément a une disposition d'élément de tiroir contenant une vue d'image et une vue de texte.
Le problème est que la fonction onClick est appelée uniquement lorsque l'image ou le "texte réel" qui diffère en taille est cliqué et non la ligne entière.
Existe-t-il un moyen de rendre l'écoute complète avec la fonction onClick? S'il vous plaît laissez-moi savoir si vous avez des idées. Merci d'avance.
RecyclerView imageL'élément de vue Recyler est sélectionné uniquement en cliquant sur le texte

RecyclerViewAdapter.java

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> { 
String[] titles; 
TypedArray icons; 
Context context; 
RecyclerViewAdapter(String[] titles, TypedArray icons, Context context){ 

     this.titles = titles; 
     this.icons = icons; 
     this.context = context; 
} 

public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 

    TextView navTitle; 
    ImageView navIcon; 
    Context context; 

    public ViewHolder(View drawerItem , int itemType , Context context){ 

     super(drawerItem); 
     this.context = context; 
     drawerItem.setOnClickListener(this); 
     if(itemType==1){ 
      navTitle = (TextView) itemView.findViewById(R.id.tv_NavTitle); 
      navIcon = (ImageView) itemView.findViewById(R.id.iv_NavIcon); 
     } 
    } 

    /** 
    *This defines onClick for every item with respect to its position. 
    */ 

    @Override 
    public void onClick(View v) { 

     MainActivity mainActivity = (MainActivity)context; 
     mainActivity.drawerLayout.closeDrawers(); 
     FragmentTransaction fragmentTransaction = mainActivity.getSupportFragmentManager().beginTransaction(); 

     //switch (getPosition()){ 
     switch (getAdapterPosition()){ 
      case 1: 
       Fragment fragment = new CountryWise(); 
       fragmentTransaction.replace(R.id.containerView,fragment); 
       fragmentTransaction.commit(); 
       break; 
      case 2: 
       Fragment f2 = new CompanyWise(); 
       fragmentTransaction.replace(R.id.containerView,f2); 
       fragmentTransaction.commit(); 
       break; 
      case 3: 
       Fragment about = new About(); 
       fragmentTransaction.replace(R.id.containerView,about); 
       fragmentTransaction.commit(); 
       break; 
     } 
    } 
} 

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

    LayoutInflater layoutInflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     if(viewType==1){ 
      View itemLayout = layoutInflater.inflate(R.layout.drawer_item_layout,null); 
      return new ViewHolder(itemLayout,viewType,context); 
     } 
     else if (viewType==0) { 
      View itemHeader = layoutInflater.inflate(R.layout.header_layout,null); 
      return new ViewHolder(itemHeader,viewType,context); 
     } 

    return null; 
} 

    /** 
*This method is called by RecyclerView.Adapter to display the data at the specified position.� 
*This method should update the contents of the itemView to reflect the item at the given position. 
*So here , if position!=0 it implies its a row_item and we set the title and icon of the view. 
*/ 

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

    if(position!=0){ 
     holder.navTitle.setText(titles[position - 1]); 
     holder.navIcon.setImageResource(icons.getResourceId(position-1,-1)); 
    } 
} 

@Override 
public int getItemViewType(int position) { 
    if(position==0)return 0; 
    else return 1; 
} 

}

drawer_item_layout.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="horizontal" 
android:paddingBottom="8dp" 
android:paddingTop="8dp" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<ImageView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="16dp" 
    android:id="@+id/iv_NavIcon" 
    /> 

<TextView 
    android:layout_gravity="center" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="30dp" 
    android:id="@+id/tv_NavTitle" 
    android:textAppearance="?android:attr/textAppearanceMedium" 
    android:textColor="#000000" 
    android:textSize="18sp" 
    android:textStyle="bold" 
    /> 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.DrawerLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/drawerMainActivity" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

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

    <android.support.v7.widget.Toolbar 
xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/toolBar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="?attr/colorPrimary" 
     android:fitsSystemWindows="true" 
     android:minHeight="?android:attr/actionBarSize" 
     android:theme="@style/ThemeOverlay.AppCompat.Dark" /> 

    <FrameLayout 
     android:id="@+id/containerView" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical"> 

    </FrameLayout> 
</LinearLayout> 

<android.support.v7.widget.RecyclerView 
    android:id="@+id/recyclerView" 
    android:layout_width="240dp" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    android:background="#FFFFFF" 
    android:paddingTop="40dp" 
    android:scrollbars="vertical" /> 

</android.support.v4.widget.DrawerLayout> 

S'il vous plaît laissez-moi savoir si vous avez besoin de plus de code.

+0

voir si votre vue RecyclerView ou sa parent a la largeur wrap_content – DavidH

+0

la tiroirlayout qui contient recyclerview a la largeur comme match_parent et le changement de la textview à match_parent ne fonctionne pas non plus. une autre idée? –

+0

Essayez de définir l'arrière-plan drawer_item_layout sur # 000000 et de voir si l'élément est en réalité pleine largeur ou seulement envelopper le contenu. – DavidH

Répondre

1

Dans l'adaptateur de onCreateViewHolder(), modifiez les inflate() appels comme suit.

if(viewType == 1) { 
    View itemLayout = layoutInflater.inflate(R.layout.drawer_item_layout, parent, false); 
    return new ViewHolder(itemLayout, viewType, context); 
} 
else if(viewType == 0) { 
    View itemHeader = layoutInflater.inflate(R.layout.header_layout, parent, false); 
    return new ViewHolder(itemHeader, viewType, context); 
} 

Vos lignes sont ne correspondent pas la largeur du RecyclerView, parce que vous n'êtes pas passer parent au Inflater, il est donc enveloppant la largeur à la place.

+1

Merci beaucoup ..! cela a fonctionné parfaitement .... !!! –

0

vous pouvez essayer cette Définir un identifiant à la disposition des parents du RecyclerView dans votre cas, la mise en page linéaire et lier cette disposition dans le support de vue et régler la onclick à cette disposition, il devrait fonctionner

+0

Pouvez-vous s'il vous plaît partager un échantillon de code? Ce serait très utile –