2012-08-28 9 views
22

So scheint es, dass bei der Verwendung eines ViewPager der OnPageSelected Listener nicht für die erste Seite mit dem gleichen Problem wie this aufgerufen wird.ViewPager onPageAusgewählt für die erste Seite

Ich habe einige Logik, die einige teurer UI-Elemente für die aktuell ausgewählte Seite und das funktioniert auffüllt, wenn Seite geändert wird, aber it doesn't work for the first page.

Wenn ich das aktuelle Element nach dem Listener, der Rückruf für die gefeuert wird erste Seite, aber die Aussicht ist noch nicht initialisiert, so kann ich es nicht manipulieren:

// Inside PagerAdapter.instantiateItem 

ViewHolder vh = new ViewHolder(); 
cursor.moveToPosition(position); 
vh.view = adapter.newView(context, cursor, null); 
// Set position as tag so we can retrieve it with findViewByTag 
vh.view.setTag(position); 

((ViewPager) collection).addView(vh.view,0);  

return vh; 

// Inside MyActivity.onCreate 

pagerAdapter = new SingleMessagePagerAdapter(this, cursor); 
pager = (ViewPager)findViewById(R.id.message_pager); 
pager.setAdapter(pagerAdapter); 
pager.setOnPageSelectedListener(this); 
pager.setCurrentItem(selectedItem); 

// Inside MyActivity.onPageSelected 

// Retrieve tagged view 
View view = pager.findViewWithTag(position); 

Hier view endet null sein, weil PagerAdapter.instantiateItem noch nicht ausgeführt worden. Ich denke also, meine Frage ist, an welcher Stelle im Aktivitäts-Lebenszyklus kann ich sicher sein, dass der ViewPager die Ansicht initialisiert hat? Ich habe versucht, dies innerhalb Activity.onAttachedToWindow und Activity.onResume zu tun, aber es scheint, dass beide vor PagerAdapter.instantiateItem gefeuert werden.

Antwort

2

versuchen Sie, Fragmente zu verwenden!

public class SectionsPagerAdapter extends FragmentPagerAdapter { 

    public SectionsPagerAdapter() { 
     super(getSupportFragmentManager()); 
    } 

    @Override 
    public Fragment getItem(int i) { 
     Fragment fr = null; 
     if (i==0) 
      fr = new sec0frag(); 
     else if (i==1) 
      fr = new sec1frag(); 
     else if (i==2) 
      fr = new sec2frag(); 
     return fr; 
    } 

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

und erstellen 3 Fragmente Klassen

z.B. :

+0

Dies sollte funktionieren, aber was, wenn Sie durch eine Liste von Seiten blättern, deren Nummer nicht vorgegeben? Wie eine Liste von Artikeln, die aus dem Internet geholt werden und jeder von ihnen muss in jedem dieser Pager einzeln angezeigt werden? –

+0

Definieren Sie getCount() in FragmentPagerAdapter dynamisch oder versuchen Sie es in ViewPager zu aktivieren !! – SSKahani

5

Ich frage mich, warum Sie nicht nur die Logik haben, die Sie im Fragment selbst erwähnen, sondern die hosting-Aktivität. ViewPager puffert ein paar Fragmente auf beiden Seiten des aktuellen, so dass sie im Hintergrund eingerichtet werden und bereit sind zu gehen, wenn der Benutzer zu ihnen wischt. Putting die Logik in onPageSelected würde bedeuten, diese Funktionalität zu umgehen und nicht die schwere Arbeit zu tun, bis der Benutzer auf der Seite klaut.

Angenommen, Sie können das oben Gesagte nicht tun, warum nicht ein Interface with a callback function verwenden. Auslöser der Rückruf in der onCreateView Funktion fragment die Aktivität zu lassen wissen, dass es vollständig instanziiert.

1

Meine Lösung war, Pager Adapter zu erweitern und eine Schnittstelle darin zu erstellen. Anschließend muss der Adapter die Schnittstelle nur einmal nach dem Erstellen des Adapters aufrufen. Innerhalb des Interface-Callbacks können Sie die onPageChanged-Methode aufrufen, ohne eine Nullpunkterregung zu haben. Fügen Sie diese Klasse zu Ihrem Projekt hinzu und erweitern Sie Ihren Adapter daraus. Vergessen Sie nicht, den Listener auf den Adapter zu setzen, bevor Sie den Adapter auf viewpager setzen. Adapter Klasse unter:

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; 
} 
} 

Aktivitätscode:

adapter = new ViewPagerAdapter(getChildFragmentManager()); 
    adapter.setAdapterInstantiatedListener(new ExtendedPagerAdapter.AdapterListener() { 
     @Override 
     public void onAdapterInstantiated() { 
      onPageSelected(viewPager.getCurrentItem()); 
     } 
    }); 

    viewPager.addOnPageChangeListener(this); 
    viewPager.setAdapter(adapter); 
Verwandte Themen