【问题标题】:Using page adapter without fragments使用没有片段的页面适配器
【发布时间】:2013-08-08 04:08:56
【问题描述】:

是否可以在没有片段的情况下使用ViewPager? 我能找到的所有示例都将几个片段加载到 ViewPager。

我想像ListView 一样使用它。我想创建一个自定义适配器,它将根据寻呼机所在的位置扩展布局。

如果可能的话,谁能给我举个例子?

【问题讨论】:

标签: android android-viewpager


【解决方案1】:

我遇到了类似的问题,我花了一些时间才弄清楚。在此处发布我的适配器以供将来参考。

/**
 * 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】:

    是的,完全有可能。由于ViewPager.setAdapter() 采用任何实例PageAdapter,您只需要创建自己的PagerAdapter 子类(它有点像您在ListView 中使用的BaseAdapter 或ArrayAdapter 的子类)。请记住,对于 PAgerAdapter,文档说:

    实现 PagerAdapter 时,必须重写以下内容 至少方法:

    希望对你有帮助

    【讨论】:

      【解决方案3】:

      这是一个 Kotlin 解决方案。设置这个类的一个对象作为viewPager的适配器-

      class PageAdapter : PagerAdapter() {
          private val pageLayouts = listOf(R.layout.home_page_1, R.layout.home_page_2)
      
          override fun instantiateItem(container: ViewGroup, position: Int): Any =
              LayoutInflater.from(container.context).inflate(pageLayouts[position], container, false).apply {
                  container.addView(this)
              }
      
          override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) =
              container.removeView(`object` as View)
      
          override fun getCount(): Int = 2
      
          override fun isViewFromObject(view: View, `object`: Any): Boolean = (view == `object`)
      }
      

      【讨论】:

        猜你喜欢
        • 2011-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多