2012-02-06 49 views
3

我正在使用ViewPager,因此用戶可以瀏覽需要從Internet獲取的無限圖像集合。避免在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實現這一點,或知道我可以在我的代碼中更改什麼?

在此先感謝。

回答

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。 這對我來說很完美

相關問題