2013-08-08 23 views
6

È possibile utilizzare ViewPager senza frammenti? Tutti gli esempi sono riuscito a trovare caricare diversi frammenti sul ViewPager.Utilizzo dell'adattatore di pagina senza frammenti

Desidero utilizzarlo in modo simile a ListView. Vorrei creare un adattatore personalizzato che gonfierà un layout in base alla posizione in cui si trova il cercapersone.

se è possibile qualcuno può indicarmi un esempio?

risposta

7

Sì, è assolutamente possibile. Dal momento che ViewPager.setAdapter() prende qualsiasi istanza PageAdapter, è sufficiente creare la propria sottoclasse di PagerAdapter (è simile a una sottoclasse di BaseAdapter o ArrayAdapter che si utilizza in un ListView). Basta ricordare, per PAgerAdapter la documentazione dicono:

Quando si implementa una PagerAdapter, è necessario ignorare i seguenti metodi al minimo:

Spero che questo aiuti

11

ho avuto il problema simile e mi c'è voluto del tempo per capirlo. Pubblicando il mio adattatore qui per riferimento futuro.

/** 
* A page adapter which works with a large data set by reusing views. 
*/ 
public abstract class ListPageAdapter<T> extends PagerAdapter { 

    // Views that can be reused. 
    private final List<View> mDiscardedViews = new ArrayList<View>(); 
    // Views that are already in use. 
    private final SparseArray<View> mBindedViews = new SparseArray<View>(); 

    private final ArrayList<T> mItems; 
    private final LayoutInflater mInflator; 
    private final int mResourceId; 

    public ListPageAdapter(Context context, int viewRes) { 
    mItems = new ArrayList<T>(); 
    mInflator = LayoutInflater.from(context); 
    mResourceId = viewRes; 
    } 

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

    @Override 
    public boolean isViewFromObject(View v, Object obj) { 
    return v == mBindedViews.get(mItems.indexOf(obj)); 
    } 

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
    View view = mBindedViews.get(position); 
    if (view != null) { 
     mDiscardedViews.add(view); 
     mBindedViews.remove(position); 
     container.removeView(view); 
    } 
    } 

    @Override 
    public Object instantiateItem(ViewGroup container, int position) { 
    View child = mDiscardedViews.isEmpty() ? 
     mInflator.inflate(mResourceId, container, false) : 
      mDiscardedViews.remove(0); 

    T data = mItems.get(position); 
    initView(child, data, position); 

    mBindedViews.append(position, child); 
    container.addView(child, 0); 
    return data; 
    } 

    public void add(T item) { 
    mItems.add(item); 
    } 

    public T remove(int position) { 
    return mItems.remove(position); 
    } 

    public void clear() { 
    mItems.clear(); 
    } 

    /** 
    * Initiate the view here 
    */ 
    public abstract void initView(View v, T item, int position); 
} 

viewPager non viene aggiornato automaticamente quando i dati vengono modificati nell'adattatore. Per quello che ho usato

pager.setAdapter(null); 
pager.setAdapter(myAdapter); 
pager.setCurrentItem(0); 
+2

Grazie per questo pezzo di codice – John

Problemi correlati