2013-07-30 4 views
6

oViewPager.setOffscreenPageLimit (0) 'ı ayarladığımda bile, görüntüleyici cihazım hala görünen sayfanın her bir tarafında ekran sayfasından 1 tane yüklenir.ViewPager.setOffscreenPageLimit (0) hiç bir etkisi yoktur. ViewPager'da bir seferde sadece bir sayfayı nasıl yüklerim?

Kullanıcı yalnızca sayfayı kaydırdığında sayfayı nasıl yükler?

Benim adaptör eğer yardımcı olur:

public class MainPagerAdapter extends FragmentPagerAdapter { 
    protected static final String[] CONTENT = new String[] { "page 1", "page 2", "page 3", "page 4", }; 

    private int mCount = CONTENT.length; 

    public MainPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     //return TestFragment.newInstance(CONTENT[position % CONTENT.length]); 
     return MainFragment.newInstance(position); 
    } 

    @Override 
    public int getCount() { 
     return mCount; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return MainPagerAdapter.CONTENT[position % CONTENT.length]; 
    } 

    public void setCount(int count) { 
     if (count > 0 && count <= 10) { 
      mCount = count; 
      notifyDataSetChanged(); 
     } 
    } 


} 

cevap

3

Kullanıcı sadece sayfayı kaydırdığında sayfayı nasıl yüklerim?

Kendi Yazıcınızı Yazabilirsiniz ViewPager. Jani'nin cevabıyla da belirtildiği gibi, ViewPager, her bir tarafa minimum 1 sayfa sınırına sahiptir.

Kaydırma animasyonu sorunsuz çalışması için bu gereklidir. Aksi takdirde, bir sonraki sayfa için kullanıcı arayüzünü ayarlamanızı beklemek zorunda kalırsak, kullanıcının kaydırması donmuş olur veya boş içeriğe kaydırılır, ancak bu kullanıcı arayüzü kurulduğunda sizi alır.

5

Başka bir alternatif, OnPageChangeListener kullanmaktır ve bir sayfa değişikliği olduğunda, parçalarınızda bir yenileme yöntemi çağırın.

Bu, daha yüksek bir OffScreenPageLimit ayarlamanızı gerektirecektir, ancak fragmanlar her görüntülendiğinde güncellenecektir.

pager.setOnPageChangeListener(new OnPageChangeListener() { 

    @Override 
    public void onPageSelected(int position){ 
     ((MyRefreshableFragment)pager.getAdapter().getItem(position)).refresh(); 
    } 

    @Override 
    public void onPageScrolled(int arg0, float arg1, int arg2) {} 
    @Override 
    public void onPageScrollStateChanged(int arg0) {} 
    }); 
+0

-1 bir konum için parçayı/görünümü döndüren getItem yöntemi yoktur. AFAIK, mevcut görüntülenen parçayı nasıl alacağınız ya da visibleHint – for3st

+0

oh no'yu nasıl kullanacağınız konusunda sadece bir korsanlık var. Pager.getAdapter(). GetItem() ' – edthethird

0

bir Loader kullanmak ve onPageSelected her fragmanının yükleyiciler init.

+0

yükleyici nedir? – code511788465541441

+0

Cevabımda bir bağlantı ekledim. – Dante

+1

@Dante, Loader sınıfı ile onPageSelected üzerinde kullandığınız kodu sağlayabilir misiniz? –

0

özel viewpager kaynağını kopyalamak ederek viewpager, o zaman bu

public class LazyViewPager extends ViewGroup { 
private static final String TAG = "LazyViewPager"; 
private static final boolean DEBUG = false; 

private static final boolean USE_CACHE = false; 

private static final int DEFAULT_OFFSCREEN_PAGES = 0;//change default to load one page,no offset,ViewPager is 1,so cache 2 Fragment 
private static final int MAX_SETTLE_DURATION = 600; // ms 
gibi bu yöntemi

değiştirebilir

/** 
* Set the number of pages that should be retained to either side of the 
* current page in the view hierarchy in an idle state. Pages beyond this 
* limit will be recreated from the adapter when needed. 
* 
* <p>This is offered as an optimization. If you know in advance the number 
* of pages you will need to support or have lazy-loading mechanisms in place 
* on your pages, tweaking this setting can have benefits in perceived smoothness 
* of paging animations and interaction. If you have a small number of pages (3-4) 
* that you can keep active all at once, less time will be spent in layout for 
* newly created view subtrees as the user pages back and forth.</p> 
* 
* <p>You should keep this limit low, especially if your pages have complex layouts. 
* This setting defaults to 1.</p> 
* 
* @param limit How many pages will be kept offscreen in an idle state. 
*/ 
public void setOffscreenPageLimit(int limit) { 
    if (limit < DEFAULT_OFFSCREEN_PAGES) {//DEFAULT_OFFSCREEN_PAGES = 1 
     Log.w(TAG, "Requested offscreen page limit " + limit + " too small; defaulting to " + 
       DEFAULT_OFFSCREEN_PAGES); 
     limit = DEFAULT_OFFSCREEN_PAGES; 
    } 
    if (limit != mOffscreenPageLimit) { 
     mOffscreenPageLimit = limit; 
     populate(); 
    } 
} 

kaynak kodu vardır

+0

'public class LazyViewPager ViewGroup'u genişletir { özel statik final String TAG =" LazyViewPager "; özel statik son boole DEBUG = yanlış; özel statik son boole USE_CACHE = false; özel statik final int DEFAULT_OFFSCREEN_PAGES = 0; // 默认 的 加载 页面, ViewPager 是 1 个, 所以 会 加载 两个 Fragman özel statik final int MAX_SETTLE_DURATION = 600; // ms ... ' –

-1

Bunun çok geç cevap olduğunu biliyorum, ama Tanrı aşkına, birisinin önerdiği gibi kendi görüntüleyicinizi yazmak zorunda değilsiniz.

baştan şeyler almak sağlar:

nasıl çalışır viewpager: o her oluşturun zorunda değildir bu yüzden bellekte iki tarafında bir öğeyi tutan Varsayılan olarak

.

1 Çözüm:

mViewPager.setOffscreenPageLimit(0); 

için sonuçlar:

sayfa sınırı 0 çok küçük ekran dışında Talep; varsaymak 1

2 Çözüm:

@Override 
    public void setUserVisibleHint(boolean isVisibleToUser) { 
     super.setUserVisibleHint(isVisibleToUser); 
     if (isVisibleToUser) { 
      //Do something like 
      //adapter.notifyDataSetChanged(); 
     } 
    } 

biliyorum birinin yardımcı Umut: Kullanıcı böylece yöntemi kullanmak aslında görünür olduğunda Parçası güncellemek istiyorum

gelecek !!!