3

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

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

它在一个片段中,如果这有什么不同的话 - 但是 ProgressBar 和 ListView 是在一个 XML 布局中定义的,该布局在片段中膨胀。我在那里也有一个 TextView,其中包含一些错误文本 - 我想知道如何为 TextView onError() 切换 ProgressBar!

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

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

ListView.removeAllViews() 导致了相当迫在眉睫的崩溃。

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

4

3 回答 3

4

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

于 2012-11-18T18:01:57.003 回答
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 的空视图。

于 2014-02-19T13:54:37.757 回答
0

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

View emptyView = inflater.inflate(R.layout.id_of_your_layoout_file, parent, false);
getListView.setEmptyView(emptyView);
于 2012-11-18T18:00:29.813 回答