在ViewPager中按需加载内容

3
当我在ViewPager中打开页面时,它会实例化相邻的页面。我想要实现的是:
1.仅当页面处于焦点状态时加载页面内容。
2.显示一个加载屏幕,同时填充处于焦点的页面布局,并在完成后用页面布局替换加载屏幕。
有人可以指导我如何实现这两个功能吗?
1个回答

3
我不确定如何解决你的第一个问题(我认为你无法控制加载哪些页面以及加载顺序),但是我有一些可以帮助你解决第二个问题的内容:
以下是我创建的一个视图示例,它会在ViewPager的每个视图中加载:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:gravity="center">
    <LinearLayout 
        android:id="@+id/loading_message"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <ProgressBar 
            style="@style/GenericProgressIndicator"/>
        <TextView
            android:id="@+id/loading_message_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/loading_message_text"/>
    </LinearLayout>
    <WebView
        android:id="@+id/webview"
        android:layout_height="fill_parent"
        android:layout_width="fill_parent"
        android:fadingEdge="vertical"
        android:visibility="gone"
        />
</RelativeLayout>

RelativeLayout 中嵌套了两个元素:一个 LinearLayout 表示我的加载消息(包括 ProgressBar 和 TextView),以及一个 WebView,一旦加载完成就会显示我的内容。最初,WebView 的可见性设置为 GONE 以完全隐藏它。在代码中,我将视图填充并启动 AsyncTask 来加载数据。一旦数据加载完成,我将 LinearLayout 的可见性设置为 GONE 并将 WebView 的可见性设置为 VISIBLE。
AsyncTask 中的 onPostExecute - 在数据加载完成后,隐藏加载消息并显示数据。
protected void onPostExecute(Void v)
{
    LinearLayout loadingMessage = (LinearLayout)articleLayout.findViewById(R.loading_message);
    WebView articleContent = (WebView)articleLayout.findViewById(R.id.webview);

    [...]
    loadingMessage.setVisibility(View.GONE);
    articleContent.setVisibility(View.VISIBLE);

}

这个过程是每次页面实例化时都会发生吗?如果是,加载一次后如何避免它再次发生? - Yashwanth Kumar
是的,但这似乎不是问题。我在加载数据后将其缓存到HashMap中,因此如果它不存在于缓存中,则无需重新加载它,因此它不会调用AsyncTask。直到articleContent视图填充之前,它仍然会显示loadingMessage布局,但我从未在实践中看到过它。由于ViewPager是离屏加载的,所以我只有在快速滑动视图时才会看到加载消息。 - Eric Brynsvold
@EricBrynsvold:你能详细解释一下你的适配器代码吗?我不明白何时执行AsyncTask方法。提前感谢。 - Shashank_Itmaster
@Shashank_Itmaster - PagerAdapter类的instantiateItem调用是针对您适配器的每个页面调用的。这是我膨胀视图并执行我的AsyncTask(如果数据未缓存)以获取实际要在视图中显示的数据的地方。您是否遇到了获取所需数据的问题? - Eric Brynsvold
我能问一下你是否遇到过这样的问题,即在异步任务完成之前,片段被viewpager卸载了吗?我一直在使用使用loadermanagers的片段。该片段实现了LoaderCallbacks,并在创建加载器时告诉主机活动在操作栏中显示进度,在加载器完成时告诉主机活动隐藏进度。如果我在启动加载器后快速滑动页面,有时进度条永远不会消失。似乎实现LoaderCallbacks监听器的片段已被viewpager卸载。 - MartinS
我对片段的使用不是很熟悉,所以我之前没有遇到过这个问题。不确定如何确保片段不会被卸载(如果实际上正在被卸载)。 - Eric Brynsvold

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接