45

ListView からの setEmptyView メソッドに問題があります。

ここに私のJavaコードがあります:

ListView view = (ListView)findViewById(R.id.listView1);
view.setEmptyView(findViewById(R.layout.empty_list_item));

ArrayAdapter<Session> adapter1 = new ArrayAdapter<Session>(this, android.R.layout.simple_list_item_1, 
        android.R.id.text1, MainController.getInstanz().getItems());
view.setAdapter(adapter1);

empty_list_item:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:text="@string/emptyList" >

</TextView>

リストビュー:

<ListView
        android:id="@+id/listView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

コードの何が問題になっていますか? アイテムがあると、リストに表示されます。しかし、リストが空の場合、TextView.

4

12 に答える 12

100

TextView は、可視性がなくなった (android:visibility="gone") に設定された ListView アイテムのすぐ下に配置する必要があります。別のレイアウトに配置しないでください。これはあなたのメインレイアウトがどのように見えるかです

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <ListView
        android:id="@+id/listViewFangbuch"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </ListView>
    <TextView
        android:id="@+id/empty_list_item"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="gone"
        android:text="@string/emptyList" >
    </TextView>

</LinearLayout>

そして、これはあなたのコードがどのように見えるかです

ListView view = (ListView)findViewById(R.id.listViewFangbuch);
view.setEmptyView(findViewById(R.id.empty_list_item));

ArrayAdapter<Session> adapter1 = new ArrayAdapter<Session>(this, android.R.layout.simple_list_item_1, 
        android.R.id.text1, MainController.getInstanz().getItems());
view.setAdapter(adapter1);
于 2012-09-18T19:47:39.517 に答える
32

問題は、addContentViewを実行する必要があることです。

View empty = getLayoutInflater().inflate(R.layout.empty_list_item, null, false);
addContentView(empty, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
view.setEmptyView(empty);

今は元気です

于 2012-09-18T19:43:20.797 に答える
30

私にとって、この答えはどれもうまくいきませんでした。私がしなければならなかったのは、リストビューの「親」ビューに空のビューを手動で (膨らませて) 追加することでした:

ListView my_list = (ListView) findViewById(R.id.my_list);
View emptyView = getLayoutInflater().inflate(R.layout.empty_view,null);
((ViewGroup)my_list.getParent()).addView(emptyView); 
listView.setEmptyView(emptyView);
于 2013-07-23T10:16:35.537 に答える
18

最も簡単な使用方法setEmptyView()は、次のように同じレイアウトで「空の」TextView と ListViewを使用することです。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <ListView
        android:id="@+id/listView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/empty_list_item"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/emptyList"
        android:visibility="gone" />

</LinearLayout>

これで、次を使用できます。

view.setEmptyView(findViewById(R.id.empty_list_item));
于 2012-09-18T19:24:39.870 に答える
13

ここに示したすべての解決策を試して実験した結果、自動 ID が設定されたレイアウトで ListView と空の View が隣り合っていない場合は、以下のコードが最適な方法であると思います。

ViewGroup parentGroup = (ViewGroup)getListView().getParent();
View empty = getActivity().getLayoutInflater().inflate(R.layout.list_empty_view,
                                                       parentGroup,
                                                       false);
parentGroup.addView(empty);
getListView().setEmptyView(empty);

理由:

  • 親グループをインフレートに渡すことで、空のビュー レイアウトの layout_* 属性が尊重されます
  • ビューを inflate (false パラメーター) にアタッチしないと、空のビューが返されます。そうしないと、inflate は親を返し、parentGroup.findViewById(empty_view_id) を使用して、setEmptyView() で使用する空のビューを取得する必要があります。ここでは、余分なルックアップ、別の ID の必要性、およびコードでその ID を公開する必要性を回避します。空への参照を保持する必要がなければ、inflate にアタッチするように指示することが、addView 呼び出しの必要性を取り除く正しいアクションになります。
  • アンチパターン addContentView() は正しいアプローチではありません。ListView がアクティビティの表示スペースをすべて占有している限り、同等に表示されます。空のビューが ListView の兄弟になるのではなく、Activity 内の他のルート レベルのレイアウトの兄弟になります。アクティビティ内の他のすべてのビューの上にフローティング (z オーダー) しているため、機能しているように見えます。参照: Activity.addContentView(View) == ViewGroup.addContentView(View)?
于 2014-11-09T20:02:51.827 に答える
1

使うだけで、

View emptyView = getLayoutInflater().inflate(R.layout.empty_view, null);
((ViewGroup)listView.getParent()).addView(emptyView);

それ以外のlistView.setEmptyView(emptyView);

于 2014-08-22T12:00:08.467 に答える
1

また、これらの2つの方法は、空のビューを表示するのに役立ちました:

    adapter.notifyDataSetChanged();
    list.invalidateViews();
于 2014-07-30T09:00:40.990 に答える
0

私の問題は、空のビューでは機能していないように見えるフッター ビューを追加したことです。フッター ビューを削除すると、空のビューが表示されます。

于 2015-03-25T07:21:09.617 に答える
0

私はアンドロイドを学んだばかりですが、https://developer.android.com/guide/topics/ui/layout/listview.htmlのスニペットは、 いくつかの異なるアプローチを示しています:

// Create a progress bar to display while the list loads
ProgressBar progressBar = new ProgressBar(this);
progressBar.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
        LayoutParams.WRAP_CONTENT, Gravity.CENTER));
progressBar.setIndeterminate(true);
getListView().setEmptyView(progressBar);
// Must add the progress bar to the root of the layout
ViewGroup root = (ViewGroup) findViewById(android.R.id.content);
root.addView(progressBar); 

ViewGroup root = (ViewGroup) findViewById(android.R.id.content);

于 2015-11-29T00:48:05.730 に答える