ListView上的setEmptyView不在android应用程序中显示其视图

您好从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

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

问题是,我必须做一个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); 

现在很好

对我而言,这些答案都不适合我。 我所要做的是手动添加空视图(充气)到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); 

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

在尝试了这里介绍的所有解决scheme并进行实验之后,我相信下面的代码是在您的ListView和空视图不是在设置了自动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_ *属性
  • 通过不附加膨胀的视图(false参数),返回空视图。 否则,inflate将返回父节点,要求我们使用parentGroup.findViewById(empty_view_id)来获取空视图,以便与setEmptyView()一起使用。 在这里,我们避免了额外的查找,需要另一个id,并且需要在我们的代码中公开这个id。 如果我们不需要将引用保留为空,那么告诉膨胀附加将是正确的操作,消除了对addView调用的需要。
  • 反模式addContentView()不是正确的方法。 只要你的ListView占据你所有Activity的可见空间,它就会显示出来。 而不是你的空视图是你的ListView的兄弟,它最终是你的活动中的其他根级布局的兄弟姐妹。 它似乎工作,因为它是浮动(z顺序)在活动中的所有其他视图的顶部。 请参阅: Activity.addContentView(View)== ViewGroup.addContentView(View)?

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

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

用XML创build一个布局,指定要使用的ListView和空视图。 如果你给他们ID @android:id/list@android:id/empty ,android会自动使用id:empty为空的视图。

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

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

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

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

只要使用,

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

而不是listView.setEmptyView(emptyView);

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

我刚刚学会了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);