639 Stimmen

Warum aktualisiert `PagerAdapter::notifyDataSetChanged` die Ansicht nicht?

Ich verwende den ViewPager aus der Kompatibilitätsbibliothek. Ich habe es erfolgreich mehrere Ansichten, die ich durchblättern kann angezeigt bekommen.

Allerdings habe ich eine harte Zeit herauszufinden, wie man die ViewPager mit einem neuen Satz von Ansichten zu aktualisieren.

Ich habe alles Mögliche versucht, wie zum Beispiel mAdapter.notifyDataSetChanged() , mViewPager.invalidate() Ich muss sogar jedes Mal einen neuen Adapter erstellen, wenn ich eine neue Liste von Daten verwenden möchte.

Nichts hat geholfen, die Textansichten bleiben unverändert gegenüber den ursprünglichen Daten.

更新しました。 Ich habe ein kleines Testprojekt gemacht, und es ist mir fast gelungen, die Ansichten zu aktualisieren. Ich werde die Klasse unten einfügen.

Was sich jedoch nicht zu aktualisieren scheint, ist die 2. Ansicht, das "B" bleibt bestehen, es sollte nach dem Drücken der Aktualisierungsschaltfläche "Y" anzeigen.

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) {
        }
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X