更改ListView的空视图

时间:2012-11-18 17:54:37

标签: android android-layout listview

我正在使用带有自定义适配器的ListView来接收JSON响应并将其放入一个很好的列表中 - 效果很好。

我现在正在测试各种异常和错误处理,并在Android应用中捕获从我的网络API收到的错误。这一切都很好,处理得很好 - 但对于我的生活,我无法弄清楚如何设置一次ListView的“空视图”。

它位于片段内,如果这有任何区别 - 但ProgressBar和ListView是在片段中膨胀的XML布局中定义的。我内部还有一个TextView,其中包含一些错误文本 - 我想知道如何为TextView onError()切换ProgressBar!

编辑:目前,ListView使用ProgressBar作为空视图 - 我想知道如何将其更改为另一个视图 - XML定义或编程。

UI线程未被锁定,因为所有API调用都是在AsyncTask上执行的,所以这不是问题。

ListView.removeAllViews()引起了相当迫近的崩溃。

道歉,如果这是微不足道的......

3 个答案:

答案 0 :(得分:4)

您可以将空视图定义为FrameLayout,并将您想要的空状态放在该视图中,并将其更改为您更改任何其他视图内容的方式。

答案 1 :(得分:3)

我的ListView有两个空视图。一个是我在从数据库或服务器加载数据时显示的ProgressBar。其他是TextView,我在收到错误或没有数据时显示。

我将我的ListView,ProgressBar和TextView放在FrameLayout中。并将ProgressBar和TextView的可见性设置为Gone。

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

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

        <TextView 
            android:id="@+id/empty_textview"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:visibility="gone"
            android:text="@string/no_contacts_found"/>

        <ProgressBar 
            android:id="@+id/empty_progressbar"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:visibility="gone"
            android:layout_gravity="center"
            android:indeterminate="true"/>

    </FrameLayout>

在从数据库或服务器加载数据之前,我将ProgressBar的可见性更改为Visible,并将其设置为ListView的空视图。所以我的ListView开始显示ProgressBar,表明用户数据仍在加载。

如果我收到错误或没有从数据库或服务器获取数据,我将ProgressBar的可见性设置为Gone并将TextView的可见性更改为Visible。然后将TextView设置为我的ListView的空视图。

答案 2 :(得分:0)

我刚刚在一个旧项目中找到了这个代码,应该可以正常工作:

View emptyView = inflater.inflate(R.layout.id_of_your_layoout_file, parent, false);
getListView.setEmptyView(emptyView);