Динамическое изменение высоты строки в списке в зависимости от количества элементов списка.

Я создавал приложение для Android, в котором я использую ListView. ListView состоит из элементов списка CheckedTextView. Моя активность содержит EditText в верхней части, TextView ниже этого и кнопку внизу. Пространство между TextView и кнопкой – это область, занятая ListView. Теперь, поскольку мой ListView содержит довольно мало элементов, все пространство ListView не занято ими. Кроме того, оставшееся пространство, очевидно, меняется на разных устройствах. Я хочу знать, есть ли способ изменить высоту строки ListView, чтобы покрыть все пространство, выделенное в ListView. А также, если возникает необходимость добавить некоторые элементы, высота строки может соответствующим образом скорректировать себя. Ниже приведены некоторые фрагменты кода, так что легко понять, что такое мой макет.

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> 

Элементами являются CheckedTextView, которые реализованы с использованием BaseAdapter. Метод представления класса BaseAdapter

 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: фрагмент из основной деятельности

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

Привет. Создайте класс, подобный этому.

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

Вызовите этот метод там, где вы хотите динамически изменять высоту строки в списке.

  Utility.setListViewHeightBasedOnChildren(YourListView); 

Для получения дополнительной справки .. Надеюсь, это поможет вам.

Чтобы установить ListView для заполнения всего выделенного пространства, вы можете установить атрибут listView в XML :

 android:fillViewport=”true” 

Или в коде:

 myListView.setFillViewport(true); 

Если вы хотите изменить размер ячейки, вы можете вычислить ViewParams для установки. Например, для одной ячейки вы можете использовать:

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

Для n ячеек вы можете рассчитать вертикальный размер в зависимости от размера вашего 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); 

Для тех, кто все еще

  listItem.measure(desiredWidth, MeasureSpec.UNSPECIFIED); 

Напишите эти строки кода, как это.

If (listItem instanceof ViewGroup)

ListItem.setLayoutParams (новые LayoutParams (LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

  listItem.measure(0, 0);