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.
voir si votre vue RecyclerView ou sa parent a la largeur wrap_content – DavidH
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? –
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