Создание нового заголовка с динамическим - PullRequest
1 голос
/ 10 июля 2019

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

С помощью этого методаавтопрокрутка сделана, но она не прокручивается бесконечно

 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);
}

И установите в окне повторного просмотра вот так

  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);

Любая помощь поможетполный

1 Ответ

1 голос
/ 10 июля 2019

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

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

...