动态创建突破性的新标题

时间:2019-07-10 09:24:09

标签: java android android-recyclerview autoscroll

我正在创建一个突发新闻应用程序,并且我想无限滚动recyclerview,但是在列表大小确定后要结束滚动,因此如何自动滚动recyclerview。

  

通过这种方法,可以完成自动滚动,但不会无限滚动

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

并像这样在recyclerview中设置

  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 个答案:

答案 0 :(得分: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初始化为输入大小的两倍,依此类推),但是主要规则是检测{{1}中的特定事件},并增加适配器的大小。

另请参阅h22's answer

如果您感兴趣的话,找到了一些article(在Kotlin中),该方法可以实现另一种方法。