避免在ViewPager中切换页面,直到下一页上的内容准备就绪

时间:2012-02-06 11:13:14

标签: android fragment android-viewpager

我使用的是ViewPager,因此用户可以浏览需要从互联网上获取的无限图像集。

我不想更改为下一页/上一页,除非已加载其图像。因此,如果用户向右/向左滑动,当前图像仍将显示,其中进度条旋转在顶部,并且在图像准备好之前不会执行对下一页/上一页的更改。在那个瞬间,页面会交换,进度条会消失。

目前我正尝试使用以下布局为ViewPager和FragmentStatePageAdapter的子视图实现此功能。

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <ImageView 
        android:id="@+id/imageview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:contentDescription="@string/label_painting"
        android:visibility="gone" />

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

</FrameLayout>

在片段中,我按照下面列出的步骤进行操作:

  • 在onCreateView中,我可以看到进度条。
  • 在同一个方法中,我启动一个获取图像并将字节流解码为位图的线程。
  • 一旦位图可用,线程就会向处理程序发送一条消息,该处理程序在ImageView中设置位图,使其可见并隐藏进度条。

我所遵循的这种方法的问题是,如果在用户滑动时尚未提取图像,则前一图像消失,并且他看到旋转的进度条,直到新图像可用。继续看图像会好得多。

是否有人能够使用ViewPager实现此功能,或者知道我的代码中可以更改哪些内容?

提前致谢。

1 个答案:

答案 0 :(得分:2)

我几乎一样。

您可以通过以下方式在适配器中启用/禁用视图分页:

//disable viewpager

public class CustomViewPager extends ViewPager {
private boolean enabled;
public CustomViewPager(Context context, AttributeSet attrs) {
    super(context, attrs);
    this.enabled = true;
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    if (this.enabled) {
        return super.onTouchEvent(event);
    } 
    return false;
}

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    if (this.enabled) {
        return super.onInterceptTouchEvent(event);
    } 
    return false;
}

public void setPagingEnabled(boolean enabled) {
    this.enabled = enabled;
}
}

如果您加载图片,请使用AsyncTask

    private class DownloadImageTask extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
    }

    @Override
    protected Void doInBackground(Void... arg0) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
    }   

 }

使用onPreExecute()方法停用viewpager,并在onPostExecute()中设置图片并重新启用ViewPager。 这对我来说很完美