适用于ListVIews的Android独立空视图

时间:2012-10-22 15:26:54

标签: android android-listview

我想为列表视图创建多个空视图,并以编程方式设置它们。 所以我在ListActivity中有一个listview。我的客户想要应用程序的方式,我在应用程序中有一个标题栏,所以布局看起来像这样

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/providerListLayout"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >

<include
    android:id="@+id/headerBar_ref"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    layout="@layout/header_with_dashboard_button" />

<include
    android:id="@+id/loadingView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    layout="@layout/loading_view" />

<RelativeLayout
    android:id="@+id/listViewWrapper"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_below="@id/headerBar_ref" >

    <ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/headerBar_ref" >
    </ListView>
</RelativeLayout>

所以我在单独的xml文件中有2个空视图。在Activity列表中,我尝试设置空视图,如下所示:

RelativeLayout rootLayout = (RelativeLayout) findViewById(R.id.listViewWrapper);
    RelativeLayout noFavsLayout = (RelativeLayout) this
            .getLayoutInflater().inflate(emptyViewLayoutId,
                    rootLayout);
    getListView().setEmptyView(noFavsLayout);

但是当我这样做时,空视图始终存在。我还尝试使用addContentView()添加视图,但这会占用整个屏幕。我还没能在S / O上找到解决方案

1 个答案:

答案 0 :(得分:1)

基于读取http://wiresareobsolete.com/2010/08/adapting-to-empty-views/,显示空视图的实际机制是适配器检查列表是否为空,然后将ListView或空视图的可见性设置为View.GONE,然后将另一个设置为View.VISIBLE。为了使其正常工作,两个视图必须位于同一父视图中。在您的示例中,这意味着类似

<RelativeLayout
  android:id="@+id/listViewWrapper"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:layout_alignParentBottom="true"
  android:layout_below="@id/headerBar_ref" >

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

  <TextView
    android:id="@android:id/empty"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="This list is empty."
    />

</RelativeLayout>

(请注意,我从ListView中删除了&#34; layout_below&#34;它是相对布局中唯一的项目,因此它不需要该引用。此外,视图已添加到XML,您不应该在java中对它进行充气。)

现在,如果您想以编程方式设置不同的空视图(例如在执行搜索之后),您可以将另一个视图添加到您的相对布局中,使用另一个ID(例如noResults)...并发现它&#39 ; s始终显示。

  <TextView
    android:id="@+id/noResults"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="No results were returned."
    />

因此,在你的onCreate()中,您需要找到该视图并将其可见性设置为已消失。

ListView listView = (ListView)findViewById(android.R.id.list);
View empty = findViewById(android.R.id.empty);
listView.setEmptyView(empty);
View noResults = findViewById(R.id.no_results);
noResults.setVisibility(View.GONE);

然后,每当您更改列表的空视图时,您都希望将另一个视图的可见性设置为GONE,以确保只显示一个。

listView.setEmptyView(noResults);
empty.setVisibility(View.GONE);

我希望这有帮助!