Unmotivated

やる気はない

ListView#setEmptyView() について

ListView の要素が無い場合に表示する View を指定できる setEmptyView() だが、その名前から想像できるのとは少し違う動きをする。

  • 違 : 「要素が無い場合に ListView の子供として表示させる View が設定できる」
  • 正 : 「要素が無い場合に ListView の代わりに表示する View が設定できる」

実際の動作は setEmptyView() で指定した View と ListView の Visibility を View.GONE と View.VISIBLE で入れ替えるだけとなっている。

そのため、 inflate() しただけでどこにも addView() していない View などを setEmptyView() で指定しても表示されないし、 ListView の子として表示される Header や Footer も表示されないこととなる。

通常は ListView と同階層に兄弟 View として xml に定義しておくのがよさそう。
EmptyView として設定する View の Visibility は特に指定しなくても ListView 側でやってくれるので問題ないです。

1
2
3
4
5
6
7
<ListView
    android:id="@+id/listView"
    ... />

<View
    android:id="@+id/emptyView"
    ... />
1
2
ListView listView = (ListView) findViewById(R.id.listView);
listView.setEmptyView(findViewById(R.id.emptyView));

以下は実装箇所の確認。

android.widget.AdapterView(1.6_r2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private void More ...updateEmptyStatus(boolean empty) {
    if (isInFilterMode()) {
        empty = false;
    }

    if (empty) {
        // EmptyView が設定されていた場合は自身を消して、 EmptyView を表示させている
        if (mEmptyView != null) {
            mEmptyView.setVisibility(View.VISIBLE);
            setVisibility(View.GONE);
        } else {
            // If the caller just removed our empty view, make sure the list view is visible
            setVisibility(View.VISIBLE);
        }
        // ...

    } else {
        // ...
    }
}

Comments