Cambiar dinámicamente la altura de la fila en una vista de lista basada en el número de elementos de la lista

Estaba creando una Aplicación de Android en la que utilizo un ListView. El ListView consiste en elementos de lista CheckedTextView. Mi actividad contiene un EditText en la parte superior, un TextView debajo de eso y un botón en la parte inferior. El espacio entre el TextView y el botón es el área ocupada por el ListView. Ahora, puesto que mi ListView contiene algo pocos artículos, el espacio entero del ListView no es ocupado por ellos. También el espacio que queda obviamente varía según los dispositivos. Lo que quiero saber es si hay una manera de alterar la altura de la fila de ListView para que el espacio completo asignado a la ListView está cubierto. Y también si ocurre una necesidad de agregar algunos artículos la altura de la fila puede ajustarse por consiguiente. He proporcionado algunos fragmentos de código a continuación para que sea fácil de entender lo que es mi diseño.

Activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:background="#D0D0D0" tools:context=".MainActivity" > <Button android:id="@+id/addcourse" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:text="Add Course" /> <EditText android:id="@+id/coursenameet" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:ems="10" android:layout_marginBottom="2dp" android:layout_marginTop="2dp" android:hint="Course Name" android:inputType="textCapWords" > <requestFocus /> </EditText> <View android:id="@+id/divider" android:layout_width="match_parent" android:layout_height="3dp" android:layout_below="@+id/coursenameet" android:layout_marginBottom="5dp" android:layout_marginTop="5dp" android:background="@android:color/darker_gray" > </View> <TextView android:id="@+id/weekdaytv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/divider" android:layout_marginBottom="3dp" android:layout_marginTop="3dp" android:layout_centerHorizontal="true" android:text="Select weekdays for this Course" > </TextView> <ListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_above="@+id/addcourse" android:layout_below="@+id/weekdaytv" android:divider="#FFFFFF" android:dividerHeight="2px"> </ListView> </RelativeLayout> 

Los elementos son CheckedTextViews que se implementan utilizando BaseAdapter. El método View de la clase BaseAdapter es

 public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; int colorpos = position % colors.length; if(v == null){ LayoutInflater vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(R.layout.listviewitem, null); } CheckedTextView newrow = (CheckedTextView) v.findViewById(R.id.checkedtextview); v.setBackgroundColor(colors[colorpos]); newrow.setTextColor(Color.BLACK); newrow.setText(items[position]); return v; } 

EDIT: fragmento de la actividad principal

 lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); adapter = new ItemsAdapter(MainActivity.this, weekdays, 6, lv.getBottom() - lv.getTop()); lv.setAdapter(adapter); lv.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { CheckedTextView ctv = (CheckedTextView) arg1; adapter.toggle(ctv); } }); 

Hi Crea una clase como esta

 public class Utility { public static void setListViewHeightBasedOnChildren(ListView listView) { ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) { // pre-condition return; } int totalHeight = 0; int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(), MeasureSpec.AT_MOST); for (int i = 0; i < listAdapter.getCount(); i++) { View listItem = listAdapter.getView(i, null, listView); listItem.measure(desiredWidth, MeasureSpec.UNSPECIFIED); totalHeight += listItem.getMeasuredHeight(); } ViewGroup.LayoutParams params = listView.getLayoutParams(); params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); listView.setLayoutParams(params); listView.requestLayout(); } } 

Llame a este método en donde desea cambiar dinámicamente la altura de la fila en una vista de lista.

  Utility.setListViewHeightBasedOnChildren(YourListView); 

Para más referencia .. Espero que esto le ayudará.

Para establecer su ListView para llenar todo el espacio asignado, puede establecer el atributo listView en XML :

 android:fillViewport=”true” 

O en código:

 myListView.setFillViewport(true); 

Si desea cambiar el tamaño de una celda, puede calcular ViewParams para establecer. Por ejemplo, para una sola celda, puede utilizar:

 AbsListView.LayoutParams params = new AbsListView.LayoutParams(AbsListView.LayoutParams.FILL_PARENT, AbsListView.LayoutParams.FILL_PARENT); v.setLayoutParams(params); 

Para n celdas, puede calcular el tamaño vertical basado en el tamaño de su ListView:

 int n = /* number of cells */ 3; int height = (myListView.getBottom() - myListView.getTop()); AbsListView.LayoutParams params = new AbsListView.LayoutParams(AbsListView.LayoutParams.FILL_PARENT, height/n); v.setLayoutParams(params); 

Para aquellos que todavía tienen error en

  listItem.measure(desiredWidth, MeasureSpec.UNSPECIFIED); 

Escribe estas líneas de código, como esta.

If (listItem instanceof ViewGroup)

ListItem.setLayoutParams (nuevo LayoutParams (LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

  listItem.measure(0, 0); 
  • agregar clic Listner en cada elemento de fila en ListView
  • Android: Cómo ocultar un elemento ListView
  • Android ListView con RadioButton en modo singleChoice y un diseño de fila personalizado
  • Inserción de contenido con escala escalable personalizada
  • Listview error: "Su contenido debe tener un ListView cuyo atributo id es 'android.R.id.list'"
  • Indexación de alfabetos en ListView .. Ignorar la indexación de secciones
  • Cambiar el color de fondo y color de texto del elemento de fila listview en android
  • Android: ¿Obtener la altura del elemento ListView?
  • Android ListView con diferentes diseños para cada fila
  • Problema al seleccionar el color del selector ListView cuando se pulsa
  • Cómo iterar elementos de ListView en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.