SORU
31 AĞUSTOS 2011, ÇARŞAMBA


Görünüm güncelleme değil ViewPager PagerAdapter

Uyumluluk kitaplığından ViewPager kullanıyorum. Succussfully sayfa ben birkaç görüş görüntüleme var.

Ancak, zor bir zaman Görüş yeni bir dizi ile ViewPager güncellemek için nasıl sergiyi yaşıyorum.

mAdapter.notifyDataSetChanged(), mViewPager.invalidate() veri bile yeni bir Liste kullanmak istiyorum yepyeni bir adaptör her zaman yaratmak " demesi gibi her türlü şeyi denedim.

Hiçbir şey yardımcı oldu, textviews orijinal veri değişmeden kalır.

Zaman ayırdığınız için teşekkürler.

Güncelleme: Ufak bir deneme projesi yaptım ve neredeyse görüşlerini güncelleme yapamadım. Sınıf altına yapıştır.

2. görünüm, 'B' kalır, 'Y' güncelle düğmesine bastıktan sonra. ekran gerektiğini, ancak güncelleme için ne görünür değil

public class ViewPagerBugActivity extends Activity {

    private ViewPager myViewPager;
    private List<String> data;

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

        data = new ArrayList<String>();
        data.add("A");
        data.add("B");
        data.add("C");

        myViewPager = (ViewPager) findViewById(R.id.my_view_pager);
        myViewPager.setAdapter(new MyViewPagerAdapter(this, data));

        Button updateButton = (Button) findViewById(R.id.update_button);
        updateButton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                updateViewPager();
            }
        });
    }

    private void updateViewPager() {
        data.clear();
        data.add("X");
        data.add("Y");
        data.add("Z");
        myViewPager.getAdapter().notifyDataSetChanged();
    }

    private class MyViewPagerAdapter extends PagerAdapter {

        private List<String> data;
        private Context ctx;

        public MyViewPagerAdapter(Context ctx, List<String> data) {
            this.ctx = ctx;
            this.data = data;
        }

        @Override
        public int getCount() {
            return data.size();
        }

        @Override
        public Object instantiateItem(View collection, int position) {
            TextView view = new TextView(ctx);
            view.setText(data.get(position));
            ((ViewPager)collection).addView(view);
            return view;
        }

        @Override
        public void destroyItem(View collection, int position, Object view) {
             ((ViewPager) collection).removeView((View) view);
        }

        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view == object;
        }

        @Override
        public Parcelable saveState() {
            return null;
        }

        @Override
        public void restoreState(Parcelable arg0, ClassLoader arg1) {
        }

        @Override
        public void startUpdate(View arg0) {
        }

        @Override
        public void finishUpdate(View arg0) {
        }
    }
}

CEVAP
2 EYLÜL 2011, Cuma


Bunu başarmak için çeşitli yollar vardır.

İlk seçenek daha kolay, ama biraz daha verimsiz.

Böyle PagerAdapter: getItemPosition geçersiz kılar

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

notifyDataSetChanged(), görünüm çağrı aradığınızda bu şekilde, tüm görünümleri kaldırmak ve onları yeniden. Böylece yeniden etkisi elde edilir.

İkinci seçenek, suggested by Alvaro Luis Bustamante (previously alvarolb), yeni bir görünüm başlatmasını instantiateItem() 9 *yöntem olacaktır. Sonra notifyDataSetChanged() yerine findViewWithTag() güncellemek istediğiniz görünüme bulabilirsiniz.

İkinci yaklaşım çok esnek ve yüksek ölçülebilir. Orijinal araştırma için alvarolb şeref.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ama Jenna

    Ama Jenna

    29 NİSAN 2011
  • FOSDEM

    FOSDEM

    13 Ocak 2009
  • George McCarron

    George McCar

    29 Mayıs 2013