Я создаю приложение с последними новостями, и я хочу бесконечно прокручивать recyclerview, но его конец после того, как размер его списка выполнен, так как можно автоматически прокручивать recyclerview.
By this method the autoscroll is done but it not scroll infinite
public void autoScrollAnother() {
scrollCount = 0;
final int speedScroll = 1200;
final Handler handler = new Handler();
final Runnable runnable = new Runnable() {
@Override
public void run() {
if (scrollCount == breakingNewAdapter.getItemCount()){
breakingNewAdapter.notifyDataSetChanged();
}
brakingNews.smoothScrollToPosition((scrollCount++));
handler.postDelayed(this, speedScroll);
}
};
handler.postDelayed(runnable, speedScroll);
}
And set in recyclerview like this
layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
brakingNews.setLayoutManager(layoutManager);
brakingNews.setHasFixedSize(true);
brakingNews.setItemViewCacheSize(10);
brakingNews.setDrawingCacheEnabled(true);
brakingNews.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_LOW);
brakingNews.setAdapter(breakingNewAdapter);
Any help it will more help full
Я предлагаю вам реализовать библиотеку подкачки




Вот решение без прослушивателей и программной прокрутки.
Увеличивайте возвращаемое значение getItemCount по мере того, как пользователь достигает конца вашего списка. На самом деле не имеет значения, каков ваш фактический размер списка, важно только то, что вы будете направлять каждый вызов onBindViewHolder на конкретный элемент.
Попробуйте этот код:
public class BreakingNewsAdapter {
private List<BreakingNews> news;
private int adapterSize = 0;
public void setNews(List<BreakingNews> news) {
this.news = news;
this.adapterSize = news.size(); // some initialization
notifyDataSetChanged();
}
@Override
public int getItemCount() {
if (this.news != null)
return this.adapterSize;
return 0;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
BreakingNews item = news.get(position % news.size()); // the '%' will ensure you'll always have data to bind to the view holder
if (position == this.adapterSize - 1) {
this.adapterSize += news.size(); // do whatever you want here, just make sure to increment this.adapterSize's value
new Handler().postDelayed(() -> notifyItemInserted(position + 1), 100); // Can't notify directly from this method, so we use a Handler. May change the delay value for what works best for you.
// notifyItemInserted will animate insertion of one item to your list. You may call to notifyDataSetChanged or notifyItemRangeInserted if you don't want the animation
//new Handler().postDelayed(() -> notifyItemRangeInserted(position + 1, this.adapterSize - news.size()), 100);
//new Handler().postDelayed(this::notifyDataSetChanged, 100);
}
}
}
Вы можете заметить, что прокрутка остановится, когда вы дойдете до конца списка, и вам нужно будет прокрутить еще раз.
Если вы не хотите, чтобы прокрутка вообще останавливалась, вы можете инициализировать adapterSize очень большим числом, недостатком является то, что полоса прокрутки не будет двигаться.
Другой вариант — проверить значение перед this.adapterSize - 1.this.adapterSize - (news.size() / 2), например. Таким образом, прокрутка на мгновение остановится и продолжится автоматически.
Здесь есть много вариантов, поэтому вы можете играть с числами (возможно, инициализировать adapterSize так, чтобы он был в два раза больше размера ввода и т. д.), но главное правило — обнаружить определенное событие в onBindViewHilder и увеличить размер адаптера.
См. также ответ h22.
Нашел какой-то статья (в kotlin), который реализует другой подход, если вам интересно.
Вы ищете собственный API для этого свитка .. ?? Я думаю, что ваша реализация в порядке. За исключением того, что когда у вас есть несколько моделей новостей, отправляемых в метод set вашего адаптера, и ваш recyclerview внезапно прокручивается до последней новости.. не так ли ??