LoginSignup
8
8

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-04-07

はじめに

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()した後で使用する。

8
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8