无限循环视图寻呼机依赖于项目计数增加到任意大数字的错觉,这些项目通过模数映射到列表中的索引位置。
这样做的问题是,像Circle page指示器这样的指示器会获得任意长的数字计数,因为它们使用了宿主PagerAdapter的getCount()方法,完全打破了无限循环的假象。
即。您有3个项目要循环,您将页面适配器计数设置为1000,当用户转到项目3并滑动到项目"4“时,项目1再次显示。但指示器显示您位于第4项,并且还有数百个其他项可供滑动。而不是仅仅在3个指示器选择之间循环。
对此有解决方案吗?
发布于 2015-09-18 19:50:24
我不想花时间在新的库上。因此,我编写了一个简单的带有圆圈指示器(ImageView)的无限视图寻呼机的OnPageChangeListener。它工作得很好。AutoScrollViewPager用作无限大的viewPager。当viewpager滚动了半页而不是滚动结束时,指示器会发生变化。
截图(圆圈是图片):

用法:
bannerPager.setOnPageChangeListener(new OnPageChangeListenerForInfiniteIndicator(getActivity(), bannerList, bannerPager.getCurrentItem()));xml:
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="@dimen/home_banner_indicator_container_height">
<LinearLayout
android:id="@+id/container_home_page_indicator"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_centerHorizontal="true"
android:layout_marginBottom="@dimen/home_banner_indicator_container_inner_margin_vertical"
android:layout_marginTop="@dimen/home_banner_indicator_container_inner_margin_vertical"
android:orientation="horizontal">
</LinearLayout>
</RelativeLayout>OnPageChangeListenerForInfiniteIndicator:
import android.app.Activity;
import android.support.v4.view.ViewPager;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import com.kartaca.rbtpicker.R;
import com.kartaca.rbtpicker.model.Banner;
import java.util.ArrayList;
import java.util.List;
/**
* Created by amadeus on 9/18/15.
*/
public class OnPageChangeListenerForInfiniteIndicator implements ViewPager.OnPageChangeListener {
private Activity activity;
private List<ImageView> pageIndicatorList = new ArrayList<ImageView>();
private List<Banner> bannerList;
private LinearLayout containerIndicator;
private int viewPagerActivePosition;
private int positionToUse = 0;
private int actualPosition;
public OnPageChangeListenerForInfiniteIndicator(Activity activity, List<Banner> bannerList, int currentItem) {
this.activity = activity;
this.bannerList = bannerList;
this.actualPosition = currentItem;
this.viewPagerActivePosition = currentItem;
loadIndicators();
}
private void loadIndicators() {
containerIndicator = (LinearLayout) activity.findViewById(R.id.container_home_page_indicator);
if (pageIndicatorList.size() < 1) {
for (Banner banner : bannerList) {
ImageView imageView = new ImageView(activity);
imageView.setImageResource(R.drawable.banner_pagination_normal);// normal indicator image
imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
imageView.setLayoutParams(new ViewGroup.LayoutParams(activity.getResources().getDimensionPixelOffset(R.dimen.home_banner_indicator_width),
ViewGroup.LayoutParams.MATCH_PARENT));
pageIndicatorList.add(imageView);
}
}
containerIndicator.removeAllViews();
for (int x = 0; x < pageIndicatorList.size(); x++) {
ImageView imageView = pageIndicatorList.get(x);
imageView.setImageResource(x == positionToUse ? R.drawable.banner_pagination_active :
R.drawable.banner_pagination_normal); // active and notactive indicator
containerIndicator.addView(imageView);
}
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
actualPosition = position;
int positionToUseOld = positionToUse;
if (actualPosition < viewPagerActivePosition && positionOffset < 0.5f) {
positionToUse = actualPosition % bannerList.size();
} else {
if (positionOffset > 0.5f) {
positionToUse = (actualPosition + 1) % bannerList.size();
} else {
positionToUse = actualPosition % bannerList.size();
}
}
if (positionToUseOld != positionToUse) {
loadIndicators();
}
}
@Override
public void onPageSelected(int position) {
}
@Override
public void onPageScrollStateChanged(int state) {
if (state == 0) {
viewPagerActivePosition = actualPosition;
positionToUse = viewPagerActivePosition % bannerList.size();
loadIndicators();
}
}
}发布于 2014-10-07 21:57:40
看看InfinitePageIndicator project,也许它就是你需要的东西。
https://stackoverflow.com/questions/23112643
复制相似问题