2013-08-08 4 views
6

Можно ли использовать ViewPager без фрагментов? Все примеры, которые я мог найти, загружают несколько фрагментов в ViewPager.Использование адаптера страницы без фрагментов

Я хочу использовать его аналогично ListView. Я хотел бы создать пользовательский адаптер, который будет раздувать макет в соответствии с положением, в котором находится пейджер.

Если возможно, может кто-нибудь указать мне пример?

ответ

7

Да, это вполне возможно. Поскольку ViewPager.setAdapter() принимает любой экземпляр PageAdapter, вам просто нужно создать свой собственный подкласс PagerAdapter (его вроде как подклассифицировать BaseAdapter или ArrayAdapter, который вы используете в ListView). просто помните, что для PAgerAdapter документы говорят:

При реализации PagerAdapter, необходимо переопределить следующие методы как минимум:

Надеюсь, что это помогает

11

У меня была аналогичная проблема, и мне потребовалось некоторое время, чтобы понять это. Отправьте мой адаптер здесь для дальнейшего использования.

/** 
* 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 не обновляется автоматически при изменении данных в адаптере. Для этого я использовал

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

Спасибо за этот код – John

Смежные вопросы