ViewPager
没有碎片可以使用吗?我能找到的所有示例都将几个片段加载到 ViewPager。
我想像使用它一样使用它ListView
。我想创建一个自定义适配器,它将根据寻呼机所在的位置扩展布局。
如果可能的话,有人可以给我举个例子吗?
ViewPager
没有碎片可以使用吗?我能找到的所有示例都将几个片段加载到 ViewPager。
我想像使用它一样使用它ListView
。我想创建一个自定义适配器,它将根据寻呼机所在的位置扩展布局。
如果可能的话,有人可以给我举个例子吗?
我遇到了类似的问题,我花了一些时间才弄清楚。在此处发布我的适配器以供将来参考。
/**
* 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);
是的,它完全有可能。由于ViewPager.setAdapter()
需要任何 instance PageAdapter
,您只需要创建自己的 PagerAdapter 子类(它有点像您在 a 中使用的 BaseAdapter 或 ArrayAdapter 的子类ListView
)。请记住,对于 PAgerAdapter,文档说:
实现 PagerAdapter 时,必须至少重写以下方法:
希望这可以帮助
这是一个 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`)
}