SORU
1 HAZİRAN 2012, Cuma


ViewPager dinamik olarak güncelleme?

ViewPager içerik güncelleme yapamıyorum.

Bir soru: yöntemleri instantiateİtem ilişkisi ve doğru kullanımı() ve getıtem() FragmentPagerAdapter sınıfta?

Sadece getıtem kullanıyordum() ve benim parçaları örneğini dönmek için:

@Override
public Fragment getItem(int position) {
    return new MyFragment(context, paramters);
}

Bu iyi (ama içeriğini değiştiremem dediği gibi) çalıştı.

Bunu buldum: ViewPager PagerAdapter not updating the View

Hangi yöntem instantiateİtem hakkında konuştuk, ve o şöyle():

"Benim görüşüm setTag kullanmaktır() instantiateİtem herhangi bir örneği görüntülemek için yöntem() yöntemi"

Şimdi instantiateİtem uygulamak istiyorum() bunu yapmak için. Ama (döndürür) oraya dönmek zorundayım ve ne ile ilgili getıtem(int position) ne olduğunu bilmiyorum?

Şu anda getıtem Parça oluşturmak için kullanıyorum, yanlış mı? Ama sonra örnek parçaları değişken koymak, ya da getıtem uygulamak zorundayım ()...? Ben sadece bunu anlamıyorum.

reference okumaya çalıştım:

  • kamu soyut Parça getıtem (int position)

    Parçanın belirli bir pozisyon ile ilgili dönüş.

  • ortak Nesne instantiateİtem (ViewGroup konteyner, int pozisyon)

    O pozisyon için bir sayfa oluştur. Adaptörü sadece bu finishUpdate işlevi(ViewGroup) tarafından yapılır emin olmak gerekir, ancak kapsayıcı burada verilen görünüm ekleyerek sorumludur. Parametreleri

    konteyner sayfayı gösterilir içeren Görünüm. sayfa konumunu örneği konumlandırın.

    Verir

    Döndürür bir Nesne yeni bir sayfayı temsil ediyor. Bu bir Görünüm olması gerekmez, ama sayfanın başka bir kap olabilir.

... ama ben hala ne kadar alakalı ve ne yapmam gerektiğini anlamıyorum.

İşte benim kod. Paket v4 desteği kullanıyorum.

ViewPagerTest

public class ViewPagerTest extends FragmentActivity {
private ViewPager pager;
private MyFragmentAdapter adapter; 

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.pager1);

    pager = (ViewPager)findViewById(R.id.slider);

    String[] data = {"page1", "page2", "page3", "page4", "page5", "page6"};

    adapter = new MyFragmentAdapter(getSupportFragmentManager(), 6, this, data);
    pager.setAdapter(adapter);

    ((Button)findViewById(R.id.button)).setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            reload();
        }
    });
}

private void reload() {
    String[] data = {"changed1", "changed2", "changed3", "changed4",       "changed5", "changed6"};
//      adapter = new MyFragmentAdapter(getSupportFragmentManager(), 6, this,      data);
    adapter.setData(data);
    adapter.notifyDataSetChanged();
    pager.invalidate();

 //     pager.setCurrentItem(0);
 }
}

MyFragmentAdapter

class MyFragmentAdapter extends FragmentPagerAdapter {
private int slideCount;
private Context context;
private String[] data;

public MyFragmentAdapter(FragmentManager fm, int slideCount, Context context, String[] data) {
    super(fm);
    this.slideCount = slideCount;
    this.context = context;
    this.data = data;
}

@Override
public Fragment getItem(int position) {
    return new MyFragment(data[position], context);
}

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

public void setData(String[] data) {
    this.data = data;
}

@Override
public int getItemPosition(Object object) {
    return POSITION_NONE;
}
 }

MyFragment

public final class MyFragment extends Fragment {
private String text;

public MyFragment(String text, Context context) {
    this.text = text;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.slide, null);
    ((TextView)view.findViewById(R.id.text)).setText(text);

    return view;
}
}

Burada benzer bir sorun, cevapsız da birisi

http://www.mail-archive.com/android-developers@googlegroups.com/msg200477.html

CEVAP
1 HAZİRAN 2012, Cuma


FragmentPagerAdapter veya FragmentStatePagerAdapter kullanırken, sadece en iyi getıtem ile başa çıkmak için() ve touch instantiateİtem değil (). Bu instantiateİtem()-destroyİtem()-isViewFromObject() PagerAdapter arabirimi bu FragmentPagerAdapter çok basit getıtem uygulamak için kullanır daha düşük seviyeli bir arayüz() arabirimi.

Bu girmeden önce, bu açıklığa kavuşturmalıdır

eğer sergilenmektedir gerçek parçaları dışarı geçmek istiyorsanız, FragmentPagerAdapter ve kullanımını önlemek gerekir FragmentStatePagerAdapter.

Bu cevap daha önceki bir sürümü örneğin FragmentPagerAdapter kullanarak hata yaptı - FragmentPagerAdapter asla ilk kez görüntülenen geçti sonra bir parça yok çünkü işe yaramaz.

Bu setTag tavsiye etmiyorum() ve findViewWithTag() geçici çözüm, bağlantılı yazı sağladı. , SetTag kullanarak keşfettim gibi) ve findViewWithTag() iyi bir maç değil yani parçaları ile işe yaramaz.

Doğru çözüm getİtemPosition geçersiz kılmak için(). NotifyDataSetChanged() denir, ViewPager getİtemPosition aramaları() adaptörü tüm öğeleri farklı bir konuma taşınmış ya da kaldırılması gerekir olup olmadığını görmek için.

Varsayılan olarak, () getİtemPosition verir demektir POSİTİON_UNCHANGED, "Bu nesnenin nerede olduğunu gayet iyi, imha veya çıkarmayın." Dönen POSİTİON_NONE yerine, "Bu nesne artık gösteren bir maddenin, çıkarın." diyerek sorunu giderir Ve adaptörü her bir öğe kaldırarak yeniden etkisi vardır.

Bu tamamen meşru bir düzeltme! Bu düzeltme notifyDataSetChanged görünüm geri dönüşüm olmadan normal bir Adaptör gibi davranmasına yapar. Bu düzeltmeyi ve performansı tatmin edici uygularsanız, yarışlara gidiyoruz. İş bitti.

Eğer daha iyi performans istiyorsanız, meraklısı bir getİtemPosition kullanabilirsiniz() uygulama. Burada bir çağrı dizeleri listesini off: parçaları oluşturmak için bir örnek

ViewPager pager = /* get my ViewPager */;
// assume this actually has stuff in it
final ArrayList<String> titles = new ArrayList<String>();

FragmentManager fm = getSupportFragmentManager();
pager.setAdapter(new FragmentStatePagerAdapter(fm) {
    public int getCount() {
        return titles.size();
    }

    public Fragment getItem(int position) {
        MyFragment fragment = new MyFragment();
        fragment.setTitle(titles.get(position));
        return fragment;
    }

    public int getItemPosition(Object item) {
        MyFragment fragment = (MyFragment)item;
        String title = fragment.getTitle();
        int position = titles.indexOf(title);

        if (position >= 0) {
            return position;
        } else {
            return POSITION_NONE;
        }
    }
});

Bu uygulama ile, sadece parçaları yeni başlıklar görüntüleniyor gösterileceğini de. Herhangi bir parçaları hala listede olan başlıklar görüntüleniyor listedeki yeni yerine taşındı civarında olacak yerine, artık listede tüm bu başlıklar ile parçaları yok olacak.

Bölümü yeniden oluşturuldu, ancak yine de güncelleştirilmesi gerekiyor yoksa? Yaşayan bir parçası güncellemeleri en iyi parçası kendisi tarafından işlenir. Bir parça olmasının avantajı var - kendi denetleyicisi. Bir parça bir dinleyici ya da onCreate içinde başka bir nesneye bir gözlemci ekleyebilirsiniz () ve onDestroy sonra kaldırın(), böylece kendisini yönetme. Getıtem iç güvenlik kodu koymak zorunda değilsin() gibi bir liste Görünümü veya diğer AdapterView türleri için bir adaptör yapmak.

Son bir şey - FragmentPagerAdapter bir parça yok gelmez o getİtemPosition bir FragmentPagerAdapter tamamen işe yaramaz olduğu anlamına gelmez. Hala bu geri arama ViewPager senin parçaları yeniden düzenlemek için kullanabilirsiniz. Onları asla tamamen FragmentManager yine de kaldıracaktır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • erikbjgn's channel

    erikbjgn's c

    12 Mayıs 2008
  • kamaniusilelis

    kamaniusilel

    10 HAZİRAN 2011
  • OVERWERK

    OVERWERK

    6 Temmuz 2010