Comment puis-je utiliser le poids de la mise en page dans la vue RecyclerView ou ListView pour que les éléments de même hauteur remplissent l'espace disponible sur l'écran?

J'ai actuellement besoin d'utiliser un RecyclerView (ou ListView), mais le nombre d'articles est fixé à 4. Je souhaite que ces 4 éléments utilisent également l'espace disponible sur l'écran. Le RecyclerView est la seule vue à l'écran, sauf pour la barre d'application. Ie RecyclerView dispose de layout_height réglé sur match_parent . J'ai choisi le RecyclerView car les éléments ont différentes configurations selon l'état du modèle.

Je ne l'ai pas encore examiné, mais je suis sûr que je peux définir la hauteur par programme dans le code Java pour chaque élément. Mais cela semble peu élégant si je peux le préciser dans le XML. Des questions similaires à ma droite, lorsque j'écris ceci, répondent à cette question.

J'ai essayé ce qui suit dans le fichier item_layout.xml, la façon dont layout_weight est utilisé dans d'autres scénarios:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="vertical" android:layout_width="match_parent" android:layout_weight="1" android:layout_height="0dp">...</LinearLayout> 

Mais alors, rien ne s'affiche à l'écran.

Ce que je voudrais savoir, est-ce que je peux faire cela dans le XML de mise en page avec layout_weight ou autre chose? Si c'est le cas, comment?

3 Solutions collect form web for “Comment puis-je utiliser le poids de la mise en page dans la vue RecyclerView ou ListView pour que les éléments de même hauteur remplissent l'espace disponible sur l'écran?”

Comme l'indique la référence de l' API , layout_weight est un attribut de LinearLayout , donc il ne peut pas être utilisé avec d'autres groupes de vues comme, par exemple, RecyclerView et ListView . Au lieu de cela, vous devez définir la taille de l'article de manière programmée.

Puisque vous semblez inquiet de la propreté de votre code, je pense que c'est une solution plutôt élégante si vous utilisez un RecyclerView :

 @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater .from(parent.getContext()) .inflate(R.layout.item_list, null); int height = parent.getMeasuredHeight() / 4; int width = parent.getMeasuredWidth(); view.setLayoutParams(new RecyclerView.LayoutParams(width, height)); return new ViewHolder(view); } 

Essayez cela, travaillez pour moi

 int weight = 3; //number of parts in the recycler view. @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View rowView = LayoutInflater.from(parent.getContex()).inflate(R.layout.row,parent,false); rowView.getLayoutParams().height = parent.getHeight() / weight; return new ViewHolder(view); } 

J'ai rencontré ce problème, car j'ai eu un RecyclerView avec des entrées variables. Mon RecyclerView horizontal avait besoin d'avoir au moins trois vues sans débordement, alors j'ai construit mes vues à redimensionner au moment de l'exécution pour s'adapter à l'écran.

 class MyRecyclerView extends RecyclerView.Adapter<ViewHolder> { int mViewWidth; public MyRecyclerView(Context context) { mViewWidth = defineViewWidth(context); } private int defineViewWidth(Context context) { int definedWidth = (int) context.getResources().getDimension(R.dimen.default_view_width); DisplayMetrics dm = new DisplayMetrics(); WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); wm.getDefaultDisplay().getMetrics(dm); if (definedWidth * 3 > dm.widthPixels) { return dm.widthPixels / 3; } return definedWidth; } ... } 

Une fois que vous avez une largeur définie, vous devez définir la largeur de la vue:

 @Override public ViewHolder onCreateViewHolder(ViewHolder holder, int position) { View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.row, parent, false); ViewGroup.LayoutParams params = v.getLayoutParams(); params.width = mViewWidth; v.setLayoutParams(params); return new ViewHolder(v); } 

Vous pouvez facilement modifier cela pour vous assurer que votre RecyclerView correspond à autant d'éléments (verticalement ou horizontalement) que vous avez besoin.

coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.