Бесконечный просмотрщик с индикатором положения

Пейджеры с бесконечным циклом полагаются на иллюзию, когда количество элементов увеличивается до произвольно большого числа, которые отображаются по модулю на индексные позиции в списке.

Проблема заключается в том, что такие индикаторы, как индикаторы на странице круга, получают произвольно большое количество чисел, поскольку они используют getCount() метод хозяина PagerAdapter, полностью разрушая иллюзию бесконечного зацикливания.

То есть. У вас есть 3 элемента, которые вы хотите просмотреть, вы устанавливаете счетчик страниц на 1000, когда пользователь достигает элемента 3 и проводит пальцем до элемента "4", элемент 1 снова отображается. Но индикатор показывает, что вы находитесь в пункте 4 и что есть сотни других предметов, к которым можно провести. Вместо того, чтобы просто переключаться между 3 выборами индикатора.

Есть ли решение для этого?

2 ответа

Я не хотел проводить время с новыми библиотеками. Итак, я кодирую простой OnPageChangeListener для бесконечных пейджеров с индикатором круга (ImageView). Это работает хорошо. AutoScrollViewPager используется как бесконечный 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();
        }
    }
}

Взгляните на проект InfinitePageIndicator, возможно, это то, что вам нужно.

Другие вопросы по тегам