Как отобразить ListView во всю длину?

Рейтинг: 0Ответов: 2Опубликовано: 16.12.2014

Здравствуйте!

Есть страница с разметкой, корнейвой элемент ScrollView, в конце этой страницы располагается ListView, задача: отобразить все элементы списка с возможностью прокрутки ScrollView же). У меня получается показать либо один элемент списка, с прокруткой, по одному элементу, либо задать фиксированный размер в dp.

Ответы

▲ 1Принят

Первая ссылка, выдаваемая гуглом по запросу

listview in scrollview android

ведёт на статью на великом и могучем, автор коей ссылается на stackoverflow. Суть статьи - нужно вычислить суммарную высоту всех элементов ListView и задать полученную высоту самому ListView:

public static void setListViewHeightBasedOnChildren(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null)
    return;

int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(), MeasureSpec.UNSPECIFIED);
int totalHeight = 0;
View view = null;
for (int i = 0; i < listAdapter.getCount(); i++) {
    view = listAdapter.getView(i, view, listView);
    if (i == 0)
        view.setLayoutParams(new ViewGroup.LayoutParams(desiredWidth, LayoutParams.WRAP_CONTENT));

    view.measure(desiredWidth, MeasureSpec.UNSPECIFIED);
    totalHeight += view.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
listView.requestLayout();
}

Вызывать метод надо после инициализации и наполнения списка элементами.

Чуть подробнее - по ссылке в начале ответа.

P.S. По всему Интернету говорят, что это плохой подход, но раз надо... Лично я в этой ситуации просто вручную в коде добавляю нужное кол-во элементов в конец дочернего элемента ScrollView. И верю, что это правильнее и выигрышнее в смысле производительности.

▲ 2

Я бы на вашем место попробовал то, что вы пихаете в scrollview, сделать, как header в listview.
То, что вы пытаетесь сделать, не оч. хороший подход, хотя бы потому, что в android существует ограничение на количество view в разметке, и если данных в listview много, то даже если вы не упретесь в это ограничение, создание этого огромного количества view будет довольно трудозатратной операцией.