Избегайте переключения страниц в ViewPager, пока содержимое следующей страницы не будет готово - PullRequest
3 голосов
/ 06 февраля 2012

Я использую 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 Ответ

2 голосов
/ 06 апреля 2012

Я сделал почти то же самое.

Вы можете включить / отключить просмотр страниц в адаптере с помощью:

//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(), чтобы отключить просмотр, и в onPostExecute() установите изображение и снова включите ViewPager.Это прекрасно работает для меня

...