次のページのコンテンツが準備完了するまで、ViewPagerでのページ切り替えを避ける

私はViewPagerを使用しているので、ユーザーはインターネットからフェッチする必要のある無限の画像コレクションをブラウズできます。

画像が既に読み込まれていない限り、次の/前のページに変更したくありません。したがって、ユーザーが左右にスワイプした場合、現在の画像は表示されたままで、進行状況バーが上に回転し、次/前のページへの変更は画像が準備ができるまで実行されません。すぐにページがスワップし、プログレスバーが消えてしまいます。

現時点では、ViewPagerとFragmentStatePageAdapterの子ビューに次のレイアウトを使用して実装しようとしていました。



    

        


フラグメントでは、私は以下の手順に従います:

  • onCreateViewでは、プログレスバーを表示します。
  • 同じ方法で、イメージを取得し、バイトストリームをビットマップにデコードするスレッドを開始します。
  • ビットマップが利用可能になると、スレッドはImageViewにビットマップをセットし、それを可視にしてプログレスバーを隠すハンドラにメッセージを送ります。

私が従っているこのアプローチの問題は、ユーザーがスワイプしたときに画像がまだ取り込まれていない場合、以前の画像が消えて、新しい画像が利用可能になるまでスピンしているプログレスバーが見えるということです。画像を見続けるほうがずっといいです。

誰かがViewPagerでこれを実装できたのですか、私は自分のコードで何が変わるかも知っていますか?

前もって感謝します。

3

1 答え

私はほぼ同じことをしました。

次の方法でアダプタのビューページングを有効/無効にすることができます。

//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;
}
}

If you Load your Image use an AsyncTask

    private class DownloadImageTask extends AsyncTask {

    @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);
    }   

 }

viewpagerを無効にするには onPreExecute()メソッドを使用し、 onPostExecute()で画像を設定して ViewPager を再度有効にします。 これは私にとって完璧に機能します

2
追加された