2012-09-12 10 views
8

Ho un viewpager che utilizza il seguente adattatore e dopo che è stato caricato, la prima vista appare vuota ma non lo è. Se si scorre alla vista successiva e poi si scorre indietro posso vedere il contenuto.Perché la prima vista in ViewPager appare vuota?

import android.content.Context; 
import android.os.Parcelable; 
import android.support.v4.view.PagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.view.View; 
import android.widget.TextView; 
import java.util.ArrayList; 

public class MyPagerAdapter extends PagerAdapter { 

    Context context; 

    public ArrayList<TextView> mViews; 

    int layoutResourceId; 

    public MyPagerAdapter(Context context) { 
     mViews = new ArrayList<TextView>(); 

    } 

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

    @Override 
    public void finishUpdate(View arg0) { 

    } 

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

    @Override 
    public Object instantiateItem(View view, int position) { 
     View myView = mViews.get(position); 
     ((ViewPager)view).addView(myView); 
     return myView; 
    } 

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

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

    } 

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

    @Override 
    public void startUpdate(View arg0) { 

    } 

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

} 

E qui è il codice che implementa dalla mia attività ...

public void resetPages() { 
    if (mPageText == null) 
     return; 
    mPagerAdapter.mViews.clear(); 
    for (int i = 0; i < mPageText.size(); i++) { 
     TextView tv = new TextView(this); 
     tv.setTextSize(mSelectedFontSize); 
     tv.setText(mPageText.get(i)); 
     tv.setId(i); 
     tv.setTag(i); 
     tv.invalidate(); 
     mPagerAdapter.mViews.add(tv); 
    } 

mPagerAdapter.notifyDataSetChanged(); 
mViewPager.refreshDrawableState(); 
} 
+0

qual è il 'mResizeTextView'? –

+0

mResizeTextView è una visualizzazione testuale personalizzata utilizzata per calcolare la quantità di testo che si adatta allo spazio specificato. Ho una lunga stringa che ho bisogno di visualizzare su più pagine. Al momento è visibile solo per il debug delle pupille. – Josh

+0

Ho rimosso la riga mResizeTextView dal codice precedente. Non è necessario cambiarne la visibilità. Ancora lo stesso problema. – Josh

risposta

0

provato ad aggiungere followind onCreate metodo e il mio codice funziona ("TEXT 0" è apparso al momento del lancio). forse è solo perché il resetPages() è chiamato al momento inappropreato?

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    mPageText = new LinkedList<CharSequence>(); 
    for (int i=0; i<10; i++) { 
     mPageText.add("TEXT "+i); 
    } 
    this.mPagerAdapter = new MyPagerAdapter(this); 
    this.mViewPager = (ViewPager)this.findViewById(R.id.viewpager); 
    this.mViewPager.setAdapter(mPagerAdapter); 
    resetPages(); 
} 
0

non sono sicuro di questo, ma se si utilizza ViewGroup per la visualizzazione in instantiateItem allora potrebbe funzionare ho usato viewgroup e il suo funzionamento benissimo.

@Override 
public Object instantiateItem(View view, int position) { 
    View myView = mViews.get(position); 
    ((ViewPager)view).addView(myView); 
    return myView; 
} 

speranza mia risposta aiuta ..

0

Il problema deve essere perché vista sta prendendo tempo per caricare i contenuti e la vista non viene aggiornato dopo il contenuto è essere loaded.Try aggiungendo

handler.postDelayed(r=new Runnable() 
     { 
      @Override 
      public void run() { 
       if (mPosition == position) 
       { 

        notifyDataSetChanged(); 
        handler.removeCallbacks(r); 


       } 
      } 
     }, 1000); 

all'interno instantiateItem dell'adattatore in modo che la vista venga aggiornata dopo 1 secondo al momento della creazione. mPosition è la posizione della prima vista che si sta aprendo.Se si sta aprendo il viewpager facendo clic sulla voce nell'elenco, è necessario passare la posizione dell'elemento che si sta selezionando quando si chiama l'adattatore .. si può impostare mPostion come 0 se il primo oggetto è sempre aperto inizialmente in viewpager

Problemi correlati