首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带位置指示器的无限取景器

带位置指示器的无限取景器
EN

Stack Overflow用户
提问于 2014-04-16 22:38:32
回答 2查看 4.9K关注 0票数 1

无限循环视图寻呼机依赖于项目计数增加到任意大数字的错觉,这些项目通过模数映射到列表中的索引位置。

这样做的问题是,像Circle page指示器这样的指示器会获得任意长的数字计数,因为它们使用了宿主PagerAdaptergetCount()方法,完全打破了无限循环的假象。

即。您有3个项目要循环,您将页面适配器计数设置为1000,当用户转到项目3并滑动到项目"4“时,项目1再次显示。但指示器显示您位于第4项,并且还有数百个其他项可供滑动。而不是仅仅在3个指示器选择之间循环。

对此有解决方案吗?

EN

回答 2

Stack Overflow用户

发布于 2015-09-18 19:50:24

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

截图(圆圈是图片):

用法:

代码语言:javascript
复制
bannerPager.setOnPageChangeListener(new OnPageChangeListenerForInfiniteIndicator(getActivity(), bannerList, bannerPager.getCurrentItem()));

xml:

代码语言:javascript
复制
        <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:

代码语言:javascript
复制
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();
        }
    }
}
票数 1
EN

Stack Overflow用户

发布于 2014-10-07 21:57:40

看看InfinitePageIndicator project,也许它就是你需要的东西。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23112643

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档