Круговая автопрокрутка по горизонтали crollview android

Я хочу автоматически прокрутить горизонтальный вид прокрутки, который содержит много изображений в линейном просмотре, когда он достигает последнего изображения, появляется первый и т. Д.

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

вот мой код:

slider = (RelativeLayout)findViewById(R.id.slider);
    RelativeLayout container = (RelativeLayout) findViewById(R.id.slider);
    scrollView = new PSInfiniteScrollView(this,new PSSize(120,120));
    for (int i = 0; i < 10; i++) {
        MyCloneableView img = new MyCloneableView(this);
        img.setId(i + 20);
        img.setImageResource(R.drawable.ic_launcher);
        img.setScaleType(ImageView.ScaleType.FIT_XY);
        img.setBackgroundColor(c[i]);
        img.setTag(c[i]);
        scrollView.addItem(img);
    }

    container.addView(scrollView);

    Thread t = new Thread(new Runnable() {
        @Override
        public void run() {
            doLoop();
        }
    });

    t.start();

а вот метод doLoop:

private void doLoop(){
    do {
        scrollView.scrollBy(2, 0);
        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        scrollView.scrollBy(2, 0);
        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }   while (true);
}   

2 ответа

Я выполнил аналогичное требование, используя RecyclerView с менеджером горизонтальной линейной разметки. Вот фрагменты кода, которые могут помочь вам

  1. Чтобы вид Recycler выглядел горизонтально, используйте менеджер LinearLayout и установите его ориентацию в горизонтальное положение.

    mLinearLayoutManager = new LinearLayoutManager(context);
    mLinearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
    mRecyclerView.setLayoutManager(mLinearLayoutManager);
    
  2. Чтобы сделать его круговым: в вашем адаптере Recycler View сделайте getItemCount, чтобы он возвращал очень большое значение, например Integer.MAX_VALUE,

    @Override
    public int getItemCount() {
        return Integer.MAX_VALUE;
    }
    

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

@Override
public void onBindViewHolder(ActionItemViewHolder holder, int position) {
    position = position % ACTUAL_SIZE_OF_LIST;
};

Вот трюк, чтобы сделать его круглым!

Сделайте свой RecyclerView для прокрутки к индексу, который является половиной значения, возвращаемого вашими адаптерами getItemCount. Это можно сделать с помощью следующего кода:

mLinearLayoutManager.scrollToPosition(Integer.MAX_VALUE / 2);

(это простой взлом)

Я не понял, что именно вы имели в виду под автопрокруткой, если вы хотите, чтобы элементы прокручивались в центр экрана при нажатии на него, вот код

private void scrollToCenter(View v) {
    int itemToScroll = mRecyclerView.getChildPosition(v);
    int centerOfScreen = mRecyclerView.getWidth() / 2 - v.getWidth() / 2;
    mLayoutManager.scrollToPositionWithOffset(itemToScroll, centerOfScreen);
}

Надеюсь, это поможет вам!

Вот вы сделали я рециркуляцию просмотра с автопрокруткой

public class AdsViewer extends FrameLayout {

private static final String TAG = "AdsViewer";

private final long SWITCH_TIME = 5000;
@BindView(R.id.ads_recycler_view)
RecyclerView adsRecyclerView;

private AdsAdapter adsAdapter;

private int currentItem = 0;

private Handler switchHandler = new Handler();
private Runnable switchRunnable = new Runnable() {
    @Override
    public void run() {
        showNextAd();
    }
};

public AdsViewer(@NonNull Context context) {
    super(context);
    init();
}

public AdsViewer(@NonNull Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    init();
}

private void init() {
    inflate(getContext(), R.layout.ads_viewer, this);
    ButterKnife.bind(this);
    initRecyclerView();
}

private void initRecyclerView() {
    final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
    linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
    adsRecyclerView.setLayoutManager(linearLayoutManager);

    adsRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);
            currentItem = linearLayoutManager.findFirstCompletelyVisibleItemPosition();
            resetTimer();
        }
    });

    // add pager behavior, Add this to have paging scrolling
    //PagerSnapHelper snapHelper = new PagerSnapHelper();
    //snapHelper.attachToRecyclerView(adsRecyclerView);
}

private void resetTimer() {
    switchHandler.removeCallbacks(switchRunnable);
    switchHandler.postDelayed(switchRunnable, SWITCH_TIME);
}

public void clear() {
    if (adsAdapter != null) {
        adsAdapter.clear();
    }
}

public void setAds(List<Ads> ads) {
    if (adsAdapter == null || ads.size() != adsAdapter.getItemCount()) {
        initializeAdapter();
        adsAdapter.addItems(ads);
        resetTimer();
    }
}

private void initializeAdapter() {
    adsAdapter = new AdsAdapter(LayoutInflater.from(getContext()));
    adsRecyclerView.setAdapter(adsAdapter);
}

private void showNextAd() {
    int adsCount = adsAdapter.getItemCount();
    if (adsCount > 1) {
        if (currentItem == (adsCount - 1)) {
            currentItem = 0;
            adsRecyclerView.scrollToPosition(currentItem);
            resetTimer();
        } else {
            currentItem++;
            adsRecyclerView.smoothScrollToPosition(currentItem);
        }
    }
}
}
  • SWITCH_TIME - время прокрутки
  • onScrollStateChanged используется для сброса таймера при прокрутке пользователя.
  • Я использую smoothScrollToPosition для всех переходов, кроме случаев перехода от первого к последнему.
Другие вопросы по тегам