7

ViewPagerフラグメントなしで使用できますか? 私が見つけたすべての例は、いくつかのフラグメントを ViewPager にロードします。

と同じように使いたいListView。ページャーの位置に応じてレイアウトを拡張するカスタム アダプターを作成したいと思います。

可能であれば、誰かがその例を教えてもらえますか?

4

3 に答える 3

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);
于 2013-08-22T19:03:23.347 に答える