Help us understand the problem. What is going on with this article?

スクロールしない固定サイズのListViewを作成する

More than 5 years have passed since last update.

はじめに

AndroidのListViewは、表示領域に収まらないリストをスクロールさせて表示するためにWidgetなので、本来タイトルのような使い方は好ましくないです。
ただどうしても使いたい場面が時々出てくるので、メソッドにまとめました。

実装したコード

public static void makeFixedListView(ListView listView, int offset) {
    int totalHeight = offset;
    ListAdapter adapter = listView.getAdapter();
    int headerCount = listView.getHeaderViewsCount();
    int footerCount = listView.getFooterViewsCount();
    int itemCount = adapter.getCount();

    for (int i = 0; i < itemCount; i++) {
      View listItem = adapter.getView(i, null, listView);
      if (i < headerCount || i >= (itemCount - footerCount)) {
        listItem.setLayoutParams(new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT,
            AbsListView.LayoutParams.WRAP_CONTENT));
      } else if (listItem instanceof ViewGroup) {
        listItem.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT));
      }
      listItem.measure(0, 0);
      totalHeight += listItem.getMeasuredHeight();
    }

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

補足-1

makeFixedListView(ListView listView, int offset) のoffsetは親のViewGroupにPaddingなどが設定されていた場合を想定しています。その場合、最終的に必要となるListViewの高さに影響しますので。

補足-2

詳細は割愛しますが、ListViewにHeaderやFooterがセットされていると他のlistItemと同じように処理するとクラッシュします。原因はListViewが表示されるときに、HeaderとFooterは(AbsListView.LayoutParams)getLayoutParams()されるタイミングがあるためです。(詳細はListViewのコードを読むと分かります。)
そのためFooterとHeaderのときは、AbsListView.LayoutParamsを使うようにしています。

補足-3

このメソッドはsetAdapter()した後で使用する。

finc
健康寿命を伸ばすアプリFiNCの開発・運営を行うモバイルヘルステクノロジーベンチャー
https://finc.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away