Круговая автопрокрутка по горизонтали 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 с менеджером горизонтальной линейной разметки. Вот фрагменты кода, которые могут помочь вам
Чтобы вид Recycler выглядел горизонтально, используйте менеджер LinearLayout и установите его ориентацию в горизонтальное положение.
mLinearLayoutManager = new LinearLayoutManager(context); mLinearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); mRecyclerView.setLayoutManager(mLinearLayoutManager);
Чтобы сделать его круговым: в вашем адаптере 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 для всех переходов, кроме случаев перехода от первого к последнему.