備忘録 〜プログラミング〜

プログラミングに関する事をつらつらと、、

ScrollView内にListViewを設定すると高さが、一行分の高さになってしまう問題

ScrollViewの中にListViewを入れたとき、ListViewの高さを内容により変えたいときに実装した方法をメモしておきます。
普通に実装すると、一行分の高さにしかならないのですが、全ての行の高さを取得して、その高さをListViewに設定してやります。
こんな感じで

private void setListViewHeightBasedOnChildren(ListView listView) {
  ListAdapter listAdapter = listView.getAdapter();
  if (listAdapter == null) {
    return;
  }
  int totalHeight = listView.getPaddingTop() + listView.getPaddingBottom();
  for (int i = 0; i < listAdapter.getCount(); i++) {
    View listItem = listAdapter.getView(i, null, listView);
    if (listItem instanceof ViewGroup) {
      listItem.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
    }
    listItem.measure(0, 0);
    totalHeight += listItem.getMeasuredHeight();
  }

  ViewGroup.LayoutParams params = listView.getLayoutParams();
  params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
  listView.setLayoutParams(params);
}

これでScrollView内にListViewの高さを可変にした状態で表示する事が出来ました。
が、ListViewが長くなると、ScrollViewの途中から表示されてしまう事があるかもしれません、、
こちらは、調査中。

android - How can I put a ListView into a ScrollView without it collapsing? - Stack Overflow