ListView上的setEmptyView没有在Android应用程序中显示其视图?

时间:2012-09-18 19:16:35

标签: android listview

我在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

12 个答案:

答案 0 :(得分:99)

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

答案 1 :(得分: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);

现在很好

答案 2 :(得分: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);

答案 3 :(得分: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));

答案 4 :(得分: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)?

答案 5 :(得分:6)

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

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

答案 6 :(得分:4)

在XML中创建一个布局,指定要使用的ListView和空视图。如果您为其提供@android:id/list@android:id/empty的ID,则当列表为空时,android会自动将视图与id:empty一起使用。

答案 7 :(得分: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);

答案 8 :(得分:1)

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

    adapter.notifyDataSetChanged();
    list.invalidateViews();

答案 9 :(得分:1)

只需使用,

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

而不是listView.setEmptyView(emptyView);

答案 10 :(得分:0)

我的问题是,我添加了一个看似无法使用空视图的页脚视图。 删除页脚视图后,将显示空视图。

答案 11 :(得分: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);