Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
8
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

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

はじめに

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

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
8
Help us understand the problem. What are the problem?