2013-08-08 8 views
6

Czy można używać fragmentów bez użycia fragmentów? ViewPager? Wszystkie przykłady można znaleźć załadować kilka fragmentów do ViewPager.Korzystanie z adaptera strony bez fragmentów

Chcę używać go podobnie do ListView. Chciałbym stworzyć niestandardowy adapter, który nadmuchałby układ zgodnie z pozycją pagera.

jeśli to możliwe, czy ktoś może wskazać mi przykład?

Odpowiedz

7

Tak, to całkowicie możliwe. Ponieważ ViewPager.setAdapter() zajmuje dowolną instancję PageAdapter, wystarczy utworzyć własną podklasę PagerAdapter (jej rodzaj przypomina podklasę BaseAdapter lub ArrayAdapter, którego używasz w ListView). pamiętaj tylko, dla PAgerAdapter docs powiedzieć:

Kiedy wdrożyć PagerAdapter, należy zastąpić następujące metod na minimum:

Nadzieja to pomaga

11

miałem podobny problem i zajęło mi trochę czasu, aby zrozumieć. Zamieszczam tutaj mój adapter, by móc z niego skorzystać w przyszłości.

/** 
* 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 nie jest automatycznie aktualizowany po zmianie danych w adapterze. W tym celu użyłem

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

Dzięki za ten kawałek kodu – John

Powiązane problemy