7

ListView'ümün kaybolduğu ViewPager ile ilgili bir sorun yaşıyorum, kaydırma konumu.FragmanSaveInstanceState üzerinde arama yapmıyor mu?

ListView devlet kolayca saklanabilir ve kullanılarak geri alınabilir:

@Override 
public View onCreateView (LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) 
{ 
    View v = inflater.inflate(R.layout.frag_cool_things, container, false); 

    AdvListView listView = (AdvListView) v.findViewById(R.id.lv0); 
    listView.setOnItemClickListener(mOnListItemClicked); 

    if (null != savedInstanceState) 
    { 
     listView.onRestoreListViewInstanceState(savedInstanceState.getParcelable("list_state")); 
    } 

    mListView = listView; 

    return v; 
} 

@Override 
public void onSaveInstanceState (Bundle outState) 
{ 
    super.onSaveInstanceState(outState); 

    outState.putParcelable("list_state", mListView.onSaveListViewInstanceState()); 
} 

sorun fragmanları onDestroyView() almayanlar ediliyor çağrılan olur olduğunu ancak ancak onSaveInstanceState (Bundle outState) aramaz.

Ekranı döndürme ve böyle bir durumda ListView durumunu geri yükler ancak hızlıca kaydırarak listeyi düzgün şekilde nasıl geri yükleyeceğimi anlayamıyorum.

cevap

15

Güncelleme 12/17/11:
Aslında Fragments içeriğini kaydetmek için doğru yol buldu. FragmentStatePagerAdapter kullanmanız gerekir. Bu adaptör, parçanın durumunu düzgün bir şekilde kaydeder! :)

ESKİ:
Eh ben bunu yapmanın bir yolunu buldu .. Bu hayır hayır büyük olduğunu düşünürsek girişinizi paylaşın! : P

İşte bu sorunu sabit benim FragmentBase sınıftır:

public abstract class FragmentBase extends Fragment 
{ 
    private boolean mInstanceAlreadySaved; 
    private Bundle mSavedOutState; 

    @Override 
    public View onCreateView (LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) 
    { 
     if (null == savedInstanceState && null != mSavedOutState) { 
      savedInstanceState = mSavedOutState; 
     } 

     mInstanceAlreadySaved = false; 
     return onCreateViewSafe(inflater, container, savedInstanceState); 
    } 

    @Override 
    public void onSaveInstanceState (Bundle outState) 
    { 
     super.onSaveInstanceState(outState); 
     mInstanceAlreadySaved = true; 
    } 

    @Override 
    public void onStop() 
    { 
     if (!mInstanceAlreadySaved) 
     { 
      mSavedOutState = new Bundle(); 
      onSaveInstanceState(mSavedOutState); 
     } 

     super.onStop(); 
    } 

    public abstract View onCreateViewSafe (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState); 
} 
+0

Kendi geçici çözüm sadece OnPause() içinde SharedPreferences benim şeyler yazmak ve (OnCreateView içinde onları geri almak istiyorsa ...). Ancak bu, Sharedpreferences'ı (getActivity(). GetSharedPreferences (...)) almak için ekleme etkinliğine erişmenizi zorlar. Ayrıca, etkinlik bozulduğunda istenmeyen şeyleri de silmeniz gerekebilir (ne yaptığınıza bağlı olarak). depolama, ofc). Umarım birinin daha iyi bir yolu vardır! :) –

+0

Lütfen bkz. Güncellenmiş yanıt :) – Jona

+0

"FragmentPagerAdapter, her bir parçayı listeden kaydırırken ayırır, ancak bunları bellekte saklarlar, böylece kullanıcı geri döndüğünde yeniden takılabilirler. Daha fazla sayıda Fragment varsa FragmentStatePagerAdapter, kullanıcı tarafından geri çekildikçe yeniden oluşturulmaları gerektiğinde aşağı doğru olanları ortadan kaldıracak şekilde düşünmeye değer. Bu nedenle, daha az sayıda parçanız varsa, FragmentPagerAdapter daha mantıklıdır, ancak daha büyük kümeler için FragmentStatePagerAdapter'ı düşünün. (Android Dev Blog) –

İlgili konular