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

gur*_*gui 44 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);
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

列表显示:

<ListView
        android:id="@+id/listView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
Run Code Online (Sandbox Code Playgroud)

我的代码出了什么问题?当我有物品时,我会在列表中看到它们.但是当列表为空时我看不到TextView.

mmb*_*ian 101

您的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>
Run Code Online (Sandbox Code Playgroud)

这就是你的代码的样子

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);
Run Code Online (Sandbox Code Playgroud)

  • 当适配器变为空或非空时,ListView只在setEmptyView(emptyView)上运行setVisible(VISIBLE)或setVisible(GONE):viewView必须出现在视图树中(setContentView()/ addContentView())并且其所有父项必须就像如果你调用调用setVisible()自己 - 为ListView控件的调用setVisible(可见光)使其出现是可见的.ListView需要setEmptyView().如果你没有设置android:id ="@ android:id/empty",ListActivity只需要它 (20认同)
  • 你想解释原因吗? (2认同)
  • 如果在同一屏幕上的ListView下放置了另一个信息,请不要忘记用<LinearLayout>覆盖ListView和TextView(如@mmbrian所示).如果您忘记将ListView和TextView与其他控件分开,则不会显示TextView. (2认同)

gur*_*gui 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);
Run Code Online (Sandbox Code Playgroud)

现在很好

  • 使用它之后,addContentView()不是正确的方法.只要ListView占用了Activity的所有可见空间,它就会显得等效.而不是您的空视图是ListView的兄弟,它最终成为您的Activity中其他根级别布局的兄弟.它似乎有效,因为它在活动中的所有其他视图之上浮动(z顺序). (2认同)

dan*_*nea 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);
Run Code Online (Sandbox Code Playgroud)


Sam*_*Sam 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>
Run Code Online (Sandbox Code Playgroud)

现在你可以使用:

view.setEmptyView(findViewById(R.id.empty_list_item));
Run Code Online (Sandbox Code Playgroud)


Har*_*vey 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);
Run Code Online (Sandbox Code Playgroud)

推理:

  • 通过将父组传递给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)?


Dav*_*ave 6

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

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