Создание прорывного нового заголовка с динамическим

Я создаю приложение с последними новостями, и я хочу бесконечно прокручивать 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

Вы ищете собственный API для этого свитка .. ?? Я думаю, что ваша реализация в порядке. За исключением того, что когда у вас есть несколько моделей новостей, отправляемых в метод set вашего адаптера, и ваш recyclerview внезапно прокручивается до последней новости.. не так ли ??

Kannan_SJD 10.07.2019 13:22

Я предлагаю вам реализовать библиотеку подкачки

coroutineDispatcher 10.07.2019 14:38
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот решение без прослушивателей и программной прокрутки.

Увеличивайте возвращаемое значение 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), который реализует другой подход, если вам интересно.

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