如何让ViewPager在屏幕范围内显示多个条目(Items)

研究了两天,读了源码,测试了无数,发现实现是如此的简单,即在ViewPager要适配的PagerAdapter的子类里覆写getPageWidth,默认是返回1,若是要在Viewpager里显示多个,返回条目的宽度/ViewPager的宽度即可。

@Override
public float getPageWidth(int position) {
    return 0.33333f;
}



-----------以上是结果------

-----------下方来探求原因---------------

ViewPager在适配了PagerAdapter以后,会把所有的Item加载进来,并针对每个Item创建一个

static class ItemInfo {
    Object object;
    int position;
    boolean scrolling;
    float widthFactor;
    float offset;
}
对象,这个对象记录本Item的位置,宽度因子(即item的宽度和viewPager的宽度比,直接调用Adapter的getPageWidth函数实现widthFactor = mAdapter.getPageWidth(position);
),离ViewPager开始处的位移,这个位移是通过这个算法得到的
offset += ii.widthFactor + marginOffset;即第一个Item的位移为0,第二位移为宽度因子加上补白偏移;最后在ViewPager的Layou()函数中,通过以下方式计算每个Item应该偏移的位置:
int loff = (int) (childWidth * ii.offset);
int childLeft = paddingLeft + loff;
其中childWidth=childWidth = width - paddingLeft - paddingRight;实际上等于ViewPager自己的宽度,paddingLeft等于ViewPager延伸的宽度。
最后通过.
        child.layout(childLeft, childTop,
        childLeft + child.getMeasuredWidth(),
        childTop + child.getMeasuredHeight());
而确定子Item(child)在ViewPager中的位置。
故getPageWidth()函数的返回值,决定了ViewPager里是否可以显示多个Item。
 
  
补充:
PagerAdapter中getPageWidth()函数的介绍
 
  
/**
 * Returns the proportional width of a given page as a percentage of the
 * ViewPager's measured width from (0.f-1.f]
 *
 * @param position The position of the page requested
 * @return Proportional width for the given page position
 */
public float getPageWidth(int position) {
    return 1.f;
}

 
  

你可能感兴趣的:(技术感悟)