当 ListView 为空时显示空视图

由于某种原因,即使 列表视图不是空的,也总是出现空视图,在这种情况下是 文本视图。我以为 列表视图会自动检测何时显示空白视图。

<RelativeLayout android:id="@+id/LinearLayoutAR"
android:layout_height="fill_parent"
android:layout_width="fill_parent">
<ListView android:id="@+id/ARListView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"></ListView>
<ProgressBar android:id="@+id/arProgressBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"></ProgressBar>
<!-- Here is the view to show if the list is emtpy -->
<TextView android:id="@id/android:empty"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="No Results" />
</RelativeLayout>

如何正确地连接空视图?

164202 次浏览

应该是这样的:

<TextView android:id="@android:id/empty"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="No Results" />

请注意 身份证属性。

当你扩展 FragmentActivityActivity没有 ListActivity时,你会想看看:

SetEmptyView ()

正如应用程序所说,在布局上应该是这样的:

<ListView android:id="@+id/listView" ... />
<TextView android:id="@+id/emptyElement" ... />

活动:

this.listView = (ListView) findViewById(R.id.listView);
this.listView.setEmptyView(findViewById(R.id.emptyElement));

也可以使用 GridView..。

我有个问题。我必须让我的类扩展 ListActivity 而不是 Activity,并将 XML 中的列表重命名为 android:id="@android:id/list"

活动代码,扩展 ListActivity非常重要。

package com.example.mylistactivity;


import android.app.ListActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import com.example.mylistactivity.R;


// It's important to extend ListActivity rather than Activity
public class MyListActivity extends ListActivity {


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mylist);


// shows list view
String[] values = new String[] { "foo", "bar" };


// shows empty view
values = new String[] { };


setListAdapter(new ArrayAdapter<String>(
this,
android.R.layout.simple_list_item_1,
android.R.id.text1,
values));
}
}

在布局 xml 中,两个视图中的 id 都很重要。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">


<!-- the android:id is important -->
<ListView
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>


<!-- the android:id is important -->
<TextView
android:id="@android:id/empty"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="i am empty"/>
</LinearLayout>
<ListView android:id="@+id/listView" ... />
<TextView android:id="@+id/empty" ... />
and in the linked Activity:


this.listView = (ListView) findViewById(R.id.listView);
this.listView.setEmptyView(findViewById(R.id.empty));

如果您正在使用支持库,那么可以清楚地使用 FragmentActivity。通过构建 API 17即4.2.2映像来测试这一点。

我强烈建议您像这样使用 ViewStubs

<FrameLayout
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1" >


<ListView
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />


<ViewStub
android:id="@android:id/empty"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout="@layout/empty" />
</FrameLayout>

请参阅 Cyril Mottier中的完整示例

首先检查列表是否包含一些值:

if (list.isEmpty()) {
listview.setVisibility(View.GONE);
}

如果可以,则使用:

else {
listview.setVisibility(View.VISIBLE);
}

我尝试了以上所有的解决方案。我想出了解决这个问题的办法。在这里我张贴了完整的解决方案。

返回文章页面 Xml 文件:

<RelativeLayout
android:id="@+id/header_main_page_clist1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="20dp"
android:paddingBottom="10dp"
android:background="#ffffff" >


<ListView
android:id="@+id/lv_msglist"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="@color/divider_color"
android:dividerHeight="1dp" />


<TextView
android:id="@+id/emptyElement"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="NO MESSAGES AVAILABLE!"
android:textColor="#525252"
android:textSize="19.0sp"
android:visibility="gone" />
</RelativeLayout>

TextView (“@+ id/emptyElement”)是空列表视图的占位符。

下面是 java 页面的代码:

lvmessage=(ListView)findViewById(R.id.lv_msglist);
lvmessage.setAdapter(adapter);
lvmessage.setEmptyView(findViewById(R.id.emptyElement));

记住在将适配器绑定到 listview 之后放置 emptyView。我的第一次没有工作,在我把 setEmptyView 移到 setAdapter 之后,它现在正在工作。

产出:

enter image description here

只是为了补充一点,您并不真的需要创建新的 ID,下面这样的方法就可以了。

在布局中:

<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@android:id/list"/>


<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@android:id/empty"
android:text="Empty"/>

然后在活动中:

    ListView listView = (ListView) findViewById(android.R.id.list);
listView.setEmptyView(findViewById(android.R.id.empty));

一个程序化的解决方案将是:

TextView textView = new TextView(context);
textView.setId(android.R.id.empty);
textView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
textView.setText("No result found");
listView.setEmptyView(textView);