Я пытаюсь найти способ установить высоту списка в зависимости от высоты его дочерних элементов. Я следил за решением, приведенным здесь: Как я могу поместить ListView в ScrollView без его свертывания?
public void setListViewHeightBasedOnChildren(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
// pre-condition
return;
}
int totalHeight = 0;
for (int i = 0; i < listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i, null, listView);
if(listItem != null){
listItem.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT));
listItem.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
//listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
}
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
listView.requestLayout();
}
Теперь я вызываю указанную выше функцию в виде списка следующим образом:
public void displayReviews(ArrayList<Reviews> resultReviews){
// Hide the loading progress
hideReviewsLoading();
if(resultReviews != null && resultReviews.size() > 0){
mCurrentReviewList.onFetchFinished(resultReviews);
setListViewHeightBasedOnChildren(mCurrentReviewList.getListView());
}
else{
// Display a generic text to indicate no reviews are in yet
displayEmptyText();
}
}
Здесь выше mCurrentreviewList - это ListFragment, который в основном имеет адаптер для установки элементов в макете.
Проблема, с которой я столкнулась, заключается в том, что высота каждого элемента, который он измеряет, неточна. И поэтому в конце, когда все элементы списка (обзоры) заполняются общим списком, содержащим его, никогда полностью не отображают все элементы списка. Он срезается где-то внизу - Как показывает только 7,5 обзоров из 10 баллов.
Я не уверен, что я делаю неправильно. Любая помощь и руководство будут очень благодарны!