onPageSelected funktioniert nicht für die erste Seite

Lesezeit: 5 Minuten

Benutzer-Avatar
metemet06

Mein Pager-Adapter (erweitert PagerAdepter) enthält eine Textansicht. Und ich aktualisiere diese Textansicht mit onPageSelected von MainActivity. Die aktualisierte Textansicht für Position > 0 , aber die Startseite (Position 0) wird beim Start nicht aktualisiert. Wenn ich nach vorne wische, dann wische zurück; Es setzt den Wert für Position 0, ABER ich konnte den Wert ON START nicht setzen. Wie kann der Wert für die Sternenseite festgelegt werden?

public void onPageSelected(int position) {

             switch (position) {
                case 0: 

                     PagerAdapter.tv.setText("value"); // => doesnt work on start

                    break;

                            default:
                                   PagerAdapter.tv.setText("value");
                                         break;
}
}

Vollständiger Code:

public class QuizStart extends SlidingFragmentActivity {
 @Override
        protected void onCreate(final Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

           this.setContentView(R.layout.activity_main);

              mPager = (ViewPager)findViewById(R.id.pager);         
            QuestionPagerAdapter mAdapter = new QuestionPagerAdapter();

            mPager.setAdapter(mAdapter);
            QuizStart.onPageSelected(0);

         mPager.setOnPageChangeListener(new OnPageChangeListener() {


            @Override
            public void onPageScrollStateChanged(int arg0) { }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) { }

            @Override
            public void onPageSelected(int position) {

             switch (position) {
                case 0: 

                     PagerAdapter.tv.setText("value"); // => doesnt work on start

                    break;

                            default:
                                   PagerAdapter.tv.setText("value");
                                         break;
                }
            }

        });
}
}

  • Warum enthält Ihr PageAdapter eine Ansicht? Das klingt erstmal faul. Was versuchst du zu erreichen?

    – dmon

    18. April 2013 um 3:52 Uhr

  • Ich bekomme Daten aus der Datenbank und setze sie auf Paderadapters Textview

    – metemet06

    18. April 2013 um 3:58 Uhr

Benutzer-Avatar
ianhanniballake

Sie können manuell anrufen onPageSelected(0) wenn Sie Ihre erstellen OnPageChangeListener um den Startzustand einzustellen:

OnPageChangeListener pageChangeListener = new OnPageChangeListener() {
    @Override
    public void onPageScrollStateChanged(int arg0) { }

    @Override
    public void onPageScrolled(int arg0, float arg1, int arg2) { }

    @Override
    public void onPageSelected(int position) {

        switch (position) {
        case 0: 
            QuizStart.next.setText(getmycurrentpage()+"");
            break;

        default:

            QuizStart.next.setText(getmycurrentpage()+"");
            break;
        }
    }
});

   mPager.setOnPageChangeListener(pageChangeListener);
   // do this in a runnable to make sure the viewPager's views are already instantiated before triggering the onPageSelected call
   mPager.post(new Runnable()
   {
       @Override
       public void run() 
       {
           pageChangeListener .onPageSelected(viewPager.getCurrentItem());
       }
   });

Bearbeiten

Jetzt wird es nicht bekommen Null Pointer exception wie gezeigt von @metemet06

  • wie kann ich es verwenden? Ich konnte es nicht herausfinden

    – metemet06

    18. April 2013 um 4:17 Uhr

  • Direkt nach Ihrem viewPager.setAdapter(pagerAdapter)Anruf pagerAdapter.onPageSelected(0)

    – ianhanniballake

    18. April 2013 um 4:43 Uhr

  • Danke für die Hilfe. Aber es gibt mir immer noch nullpointerexception. Ich denke, Textview im Pageradapter ist immer noch nicht fertig, auch wenn wir es nach Set Adapter verwenden!

    – metemet06

    18. April 2013 um 5:49 Uhr

  • Dies ist falsch, wenn Sie onPageSelected manuell aufrufen, ist der Pager/Adapter möglicherweise noch nicht bereit, und wie von metemet06 angegeben, erhalten Sie eine Nullzeiger-Ausnahme.

    – Soham

    14. Juni 2014 um 23:02 Uhr

  • @Soham ist absolut richtig. Das Fragment ist noch nicht an sein übergeordnetes Element angehängt, und wenn Ihr Code darauf angewiesen ist, dass das Fragment angehängt wird (getParentFragment() oder getActivity()), stürzt es ab. Hat sonst noch jemand Ideen?

    – mtmurdock

    5. November 2014 um 15:47 Uhr

Für mich funktioniert der nächste Code

    viewPager.addOnPageChangeListener(myOnPageChangeListener);

.

    ViewPager.OnPageChangeListener myOnPageChangeListener = new ViewPager.OnPageChangeListener() {

    //declare key
    Boolean first = true;

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        if (first && positionOffset == 0 && positionOffsetPixels == 0){
            onPageSelected(0);
            first = false;
        }
    }

    @Override
    public void onPageSelected(int position) {
        //do what need
    }

    @Override
    public void onPageScrollStateChanged(int state) {
    }
};

Benutzer-Avatar
Arūnas Bedžinskas

Meine Lösung bestand darin, den Pager-Adapter zu erweitern und eine Schnittstelle darin zu erstellen. Lassen Sie dann den Adapter die Schnittstelle nur einmal aufrufen, nachdem Sie den Adapter erstellt haben. Innerhalb des Schnittstellen-Callbacks können Sie die onPageChanged-Methode aufrufen, ohne eine Nullpointer-Ausnahme zu haben. Fügen Sie diese Klasse zu Ihrem Projekt hinzu und erweitern Sie Ihren Adapter daraus. Vergessen Sie nicht, Listener auf Adapter zu setzen, bevor Sie Adapter auf Viewpager setzen. Adapterklasse unten:

public abstract class ExtendedPagerAdapter extends FragmentPagerAdapter {

private boolean instantiated;
private AdapterListener adapterListener;

public interface AdapterListener {
    void onAdapterInstantiated();
}

public ExtendedPagerAdapter(FragmentManager fragmentManager) {
    this(fragmentManager, null);
}

public ExtendedPagerAdapter(FragmentManager fragmentManager, AdapterListener adapterListener) {
    super(fragmentManager);
    this.adapterListener = adapterListener;
    instantiated = false;
}

@Override
public void finishUpdate(ViewGroup container) {
    super.finishUpdate(container);
    if (!instantiated) {
        instantiated = true;
        if (adapterListener != null) {
            adapterListener.onAdapterInstantiated();
        }
    }
}

public void setAdapterInstantiatedListener(AdapterListener adapterListener) {
    this.adapterListener = adapterListener;
}
}

  • Das ist eine nette Idee und funktioniert in meinem Fall perfekt! Ich möchte etwas mehr Zeit damit verbringen, zu untersuchen, ob finishUpdate wird tatsächlich aufgerufen, nachdem das Fragment an die Aktivität angehängt wurde.

    – Entreco

    25. Mai 2016 um 7:30 Uhr

  • Danke 🙂 Laut Google FragmentPagerAdapter.finishUpdate wird aufgerufen, wenn die Änderung der angezeigten Seiten abgeschlossen ist. Daher wird jedes Mal, wenn sich ein Fragment geändert hat, Finish Update aufgerufen. Auch wenn wir in die Quelle eintauchen, können wir sehen, dass diese Methode alle ausstehenden Transaktionen festschreibt und ausführt 🙂

    – Arūnas Bedžinskas

    25. Mai 2016 um 7:39 Uhr


Ich habe das Problem in meiner App behoben, indem ich den Code, der für die erste Seite ausgeführt werden soll, in der onCreate()-Methode meiner Aktivität hinzugefügt habe.

Es ist nicht der schönste Hack und beinhaltet etwas redundanten Code, aber da ich nur einige Textdaten laden möchte, wenn sich die Seiten ändern, ist es in meinem Fall der einfachste Weg, dies zu tun.

Der manuelle Aufruf von onPageSelected() verursachte NullPointerExceptions, genau wie in anderen Kommentaren oben beschrieben.

Es scheint mir, dass das, was Sie wirklich tun wollen, Vorrang hat getPageTitle()und dann, woanders, diesen Seitentitel greifen und ihn als Text einer TextView festlegen.

Wenn Sie Ihre Aktivität initialisieren, initialisieren Sie auf diese Weise den PagerAdapter und rufen Sie auf getTitle(0). Dadurch erhalten Sie den Titel für Seite 0. Legen Sie diesen nun in der Textansicht der Aktivität fest. Später beim Seitenwechsel einfach anrufen getTitle(newPosition) und aktualisieren Sie diese TextView.

Sie verwenden wahrscheinlich einige AsyncTasks, um das Dataset zu laden, und es ist schwer zu bestimmen, welche Aufgabe als letzte abgeschlossen wird. Und erst nach dieser letzten Aufgabe, wenn das gesamte Dataset vollständig ist, können Sie OnPageSelected aufrufen, da es einen Flush auf der Benutzeroberfläche über das gesamte Dataset ausführt.

Anstatt die OnPageSelected-Funktion manuell beim ersten Laden der Seite aufzurufen, bauen Sie das UI lieber Schritt für Schritt auf dem “normalen” Weg auf. Später, wenn der Benutzer die Seite wechselt, sollte der Datensatz vollständig sein und es ist sicher, die Aktualisierung in der OnPageSelected-Funktion vornehmen zu lassen.

Benutzer-Avatar
sivi

Da ich das getan habe, was hier vorgeschlagen wurde, und es nicht funktioniert hat, werde ich posten, was für mich funktioniert hat, war das Hinzufügen der Instanziierungsfunktion zu onPageScrolled, etwa so:

   @Override
   public void onPageScrolled(int arg0, float arg1, int arg2) {

           adapter.closeText(arg0, viewPager);

    }

Wahrscheinlich hat es funktioniert, weil onPagesScrolled weiter unten in der Zeile des Android-Task-Managers aktiviert ist, sodass wir die unerwünschte Situation verhindern, in der die Seite aufgeblasen wird, indem der Listener-Anhang zur Ansicht übersprungen wird.

1187370cookie-checkonPageSelected funktioniert nicht für die erste Seite

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy