¿Cómo puedo usar layout_weight en RecyclerView o Vista de elemento ListView para que los elementos de igual altura llenen el espacio disponible en la pantalla?

Actualmente tengo una necesidad de usar un RecyclerView (o ListView), pero el número de elementos se fija en 4. Quiero que esos 4 elementos para utilizar igualmente el espacio disponible en la pantalla. El RecyclerView es la única vista en la pantalla excepto la barra de aplicaciones. Es decir, RecyclerView tiene layout_height definido como match_parent . Elegí el RecyclerView porque los artículos tienen diseños diferentes dependiendo del estado del modelo.

Todavía no lo he buscado, pero estoy seguro de que puedo configurar la altura de forma programática en código Java para cada elemento. Pero eso parece poco elegante si puedo especificarlo en el XML. Preguntas similares a mi derecho, mientras escribo esto, responden a esa pregunta.

He intentado lo siguiente en el archivo item_layout.xml, la forma en que se usa layout_weight en otros escenarios:

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

Pero entonces nada aparece en la pantalla.

Lo que me gustaría saber es, ¿puedo hacer esto en el layout XML con layout_weight , o algo más? ¿Si es así, cómo?

Como dice la referencia de la API , layout_weight es un atributo de LinearLayout , por lo que no se puede usar con otros ViewGroups como, por ejemplo, RecyclerView y ListView . En su lugar, debe establecer la altura del elemento mediante programación.

Ya que parece preocupado por la limpieza de su código, creo que esta es una solución bastante elegante en caso de que utilice 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); } 

Prueba esto, trabaja para mi

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

Me encontré con este problema, ya que tenía un RecyclerView con entradas de variables. Mi RecyclerView horizontal necesitaba encajar al menos tres vistas sin desbordar, así que construí mis vistas para cambiar el tamaño en tiempo de ejecución para que se ajustaran a la pantalla.

 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; } ... } 

Una vez que haya definido una anchura, debe establecer el ancho de la vista:

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

Usted podría modificar fácilmente esto para cerciorarse de que su RecyclerView cabe tantos elementos (verticalmente o horizontalmente) como usted necesita.

  • Array Index fuera de límite cuando se desplaza la vista de lista rápidamente mientras se actualizan los datos desde el servidor
  • Seleccione editexts texto en una vista de lista. ¿Cómo se puede hacer? No puedo averiguarlo
  • Mejor utilizar el adaptador Cursor o el adaptador Array
  • Listview con un adaptador personalizado que contiene CheckBoxes
  • Anulación de Android ArrayAdapter
  • Mantener la posición de desplazamiento con cada actualización en la vista de lista
  • SetOnItemLongClickListener y setOnItemClickListener no se activan cuando se utiliza arrastre-ordenar-listview (DSLV)
  • Adaptador ListView personalizado Android
  • ¿Cómo puedo añadir mi diseño dinámico a ListView?
  • Cómo deshabilitar un elemento en mi ListView
  • Haga clic en un elemento ListView cambia el estado de los elementos dentro del elemento?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.