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
- Android adapter.getItem (position) .getItemId () no funciona (El método getId () no está definido para el tipo Object)
- El elemento ListView no extenderá el ancho a fill_parent
- Custom ListView no resalta ListViewItem al hacer clic
- Vista de la lista de android
- Cómo cargar elementos en el widget de vista de lista de inicio de android?
<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); } });
- Cómo definir ColorStateList para TextView?
- ¿Cómo hacer ListView personalizado con fondos de colores de los elementos?
- Buggy ListView me hace triste
- Android.content.res.Resources $ NotFoundException al establecer programación android.R.attr.listChoiceIndicatorMultiple
- Android: ¿Para establecer un elemento como seleccionado cuando se abre ListView?
- Android ListView resalta el elemento mediante programación
- Cómo resaltar ListView-Items
- Cómo arrastrar el elemento de lista desplegable a otro ListView
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);
- En la aplicación meteor como agregar orgin = * en cordova config.xml?
- Creación de una actividad principal que NO aparece en la lista de lanzadores