Бесконечный просмотрщик с индикатором положения
Пейджеры с бесконечным циклом полагаются на иллюзию, когда количество элементов увеличивается до произвольно большого числа, которые отображаются по модулю на индексные позиции в списке.
Проблема заключается в том, что такие индикаторы, как индикаторы на странице круга, получают произвольно большое количество чисел, поскольку они используют 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, возможно, это то, что вам нужно.