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);

空列表项:

<?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 应该放在 ListView 项目的正下方,其可见性设置为消失(android:visibility="gone"),不要将它放在另一个布局中。这就是您的主要布局的样子

<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 的“父”视图中:

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

在尝试了此处提供的所有解决方案并进行了试验之后,我相信下面的代码是当您的 ListView 和空 View 在设置了自动 ID 的布局中没有并排时使用的最佳方法。

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

推理:

  • 通过将父组传递给 inflate,您的空视图布局的 layout_* 属性得到尊重
  • 通过不在 inflate 中附加视图(false 参数),将返回空视图。否则,inflate 将返回父级,要求我们使用 parentGroup.findViewById(empty_view_id) 来获取与 setEmptyView() 一起使用的空视图。在这里,我们避免了额外的查找、对另一个 id 的需要以及在我们的代码中公开该 id 的需要。如果我们不需要保留对空的引用,告诉 inflate 附加将是消除对 addView 调用的需要的正确操作。
  • 反模式 addContentView() 不是正确的方法。只要您的 ListView 占据了 Activity 的所有可见空间,它就会显示为等价的。而不是您的空视图成为您的 ListView 的兄弟,它最终成为您 Activity 中其他根级布局的兄弟。它似乎可以工作,因为它在活动中的所有其他视图之上浮动(z 顺序)。请参阅:Activity.addContentView(View) == ViewGroup.addContentView(View)?
于 2014-11-09T20:02:51.827 回答
6

问题的核心在于 AdapterView 类实际上并没有将你传递给 setEmptyView() 的视图添加到任何容器中。它只是改变了可见性。正如其他答案所描述的,有很多方法可以将您的“空视图”对象放入容器中。

AdapterView 的文档确实应该更新以反映这一点,因为它并不明显。

于 2013-10-02T19:04:04.987 回答
4

在 XML 中创建一个布局,指定ListView要使用的视图和空视图。如果你给它们 ID@android:id/list和,当列表为空时@android:id/empty,android 会自动使用视图。id:empty

于 2013-08-04T08:47:35.150 回答
3

有一些正确的解决方案,但我认为这是最好的方法!

View emptyView = getLayoutInflater().inflate(R.layout.empty_list_cart, null);
addContentView(emptyView, listView.getLayoutParams()); // You're using the same params as listView
listView.setEmptyView(emptyView);
listView.setAdapter(adapter);
于 2014-04-23T21:09:10.153 回答
1

这两种方法也帮助我显示空视图:

    adapter.notifyDataSetChanged();
    list.invalidateViews();
于 2014-07-30T09:00:40.990 回答
1

只需使用,

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

代替listView.setEmptyView(emptyView);

于 2014-08-22T12:00:08.467 回答
0

我的问题是,我添加了一个似乎不适用于空视图的页脚视图。删除页脚视图后,将显示空视图。

于 2015-03-25T07:21:09.617 回答
0

我刚刚学习了 android,但来自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 回答