Android 带位置指示器的无限可视寻呼机

Android 带位置指示器的无限可视寻呼机,android,android-viewpager,infinite-loop,viewpagerindicator,Android,Android Viewpager,Infinite Loop,Viewpagerindicator,无限循环的viewpagers依赖于一种错觉,即项目的数量增加到任意大的数量,通过模数映射到列表中的索引位置 这样做的问题是,诸如圆形页面指示器之类的指示器会获得任意长的数字计数,因为它们使用主机PagerAdapter的getCount()方法,完全打破了无限循环的假象 例如,您有3个项目要循环,您将pageradapter计数设置为1000,当用户到达项目3并滑动到项目“4”时,项目1再次显示。但指示器显示您在第4项,并且有数百个其他项目需要刷卡。而不是仅仅在3个指示器选择之间循环 有解决办

无限循环的viewpagers依赖于一种错觉,即项目的数量增加到任意大的数量,通过模数映射到列表中的索引位置

这样做的问题是,诸如圆形页面指示器之类的指示器会获得任意长的数字计数,因为它们使用主机
PagerAdapter
getCount()
方法,完全打破了无限循环的假象

例如,您有3个项目要循环,您将pageradapter计数设置为1000,当用户到达项目3并滑动到项目“4”时,项目1再次显示。但指示器显示您在第4项,并且有数百个其他项目需要刷卡。而不是仅仅在3个指示器选择之间循环


有解决办法吗

看看吧,也许这是你需要的。

我不想花时间在新的图书馆上。因此,我编写了一个简单的OnPageChangeListener,用于带有圆圈指示器(ImageView)的无限可视页面。它工作得很好。AutoScrollViewPager用作无限的viewPager。当viewpager滚动页面的一半而不是滚动结束时,指示器会发生变化

屏幕截图(圆圈是图像):

用法:

bannerPager.setOnPageChangeListener(new OnPageChangeListenerForInfiniteIndicator(getActivity(), bannerList, bannerPager.getCurrentItem()));
xml:


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();
        }
    }
}
导入android.app.Activity;
导入android.support.v4.view.ViewPager;
导入android.view.ViewGroup;
导入android.widget.ImageView;
导入android.widget.LinearLayout;
导入com.kartac.rbtpicker.R;
导入com.kartac.rbtpicker.model.Banner;
导入java.util.ArrayList;
导入java.util.List;
/**
*由amadeus于2015年9月18日创建。
*/
公共类OnPageChangeListenerForInfiniteIndicator实现ViewPager.OnPageChangeListener{
私人活动;
私有列表pageIndicatorList=新建ArrayList();
私人列表横幅列表;
专用线路集装箱布局指示器;
私有int ViewPageActivePosition;
私有int PositionUse=0;
私人内部实际位置;
公共OnPageChangeListenerForInfiniteIndicator(活动活动、列表横幅列表、int currentItem){
这个。活动=活动;
this.bannerList=bannerList;
this.actualPosition=当前项目;
this.viewPagerActivePosition=currentItem;
负载指示器();
}
私有void loadIndicators(){
containerIndicator=(LinearLayout)activity.findViewById(R.id.container\u home\u page\u indicator);
如果(pageIndicatorList.size()<1){
用于(横幅:横幅列表){
ImageView ImageView=新的ImageView(活动);
imageView.setImageResource(R.drawable.banner_分页_normal);//正常指示器图像
imageView.setScaleType(imageView.ScaleType.CENTER_内);
imageView.setLayoutParams(新的ViewGroup.LayoutParams(activity.getResources().getDimensionPixelOffset(R.dimen.home\u banner\u indicator\u width)),
ViewGroup.LayoutParams.MATCH_PARENT);
pageIndicatorList.add(图像视图);
}
}
containerIndicator.removeAllViews();
对于(int x=0;x0.5f){
PositionUse=(实际位置+1)%bannerList.size();
}否则{
PositionUse=实际位置%bannerList.size();
}
}
如果(PositionToSeold!=positionToUse){
负载指示器();
}
}
@凌驾
已选择页面上的公共无效(内部位置){
}
@凌驾
公共无效onPageScrollStateChanged(int状态){
如果(状态==0){
ViewPageActivePosition=实际位置;
PositionUse=ViewPageActivePosition%bannerList.size();
负载指示器();
}
}
}

我的直觉是,需要覆盖指示器包装的viewpager,以使用相同的模块算术。指示器位置从第二个点开始。我的横幅列表中有七个项目。
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();
        }
    }
}