【问题标题】:Automatic RecyclerView scrolling自动 RecyclerView 滚动
【发布时间】:2021-06-24 16:03:50
【问题描述】:

我正在尝试在我的应用中实现一个横幅,它的工作方式类似于广告横幅的工作方式,每隔几秒它就会滚动到下一个广告。我希望它是动态的,所以我使用了 RecyclerView,我使用 snap helper 将它水平放置以获得很好的效果。然而,这是我正在努力解决的自动滚动问题,我需要它在几秒钟后滚动到下一张卡片,当它到达末尾时,滚动回第一张卡片并重新开始。

我也看到人们为此谈论一个 viewflipper,但我从未使用过,也不确定它是否会产生预期的效果。

【问题讨论】:

  • scrollToPosition(int position); ?如果是最后一个位置,那么你去 0
  • 但它也可以是一个圆形的viewpager,你可以找到一些可以帮助你的不错的库
  • @TamHuynh 我一定会去看看,谢谢你的评论!
  • @TamHuynh 如果我要走 ViewFlipper 路线,它的动态性如何?我能否将 json 拉下来并显示不同的视图,每个视图都填充了解析的 json 数据?
  • 我是否能够挑战视图的外观?就像我如何为“RecyclerView”制作卡片一样?

标签: android android-recyclerview


【解决方案1】:

首先,像这样创建一个TimerTask类,

  private class ScrollTask extends TimerTask {
                public void run() {
                recyclerview.post(new Runnable() {
                    public void run() {

                        int nextView = (adapter.getAdapterPosition() + 1) % adapter.getItemCount()

                       recyclerView.smoothScrollToPosition(nextView);    
                    }
                });
            }
        }

然后创建一个定时器对象

Timer timer = new Timer();

并像这样安排任务,

timer.schedule(new ScrollTask(), interval // delay before task is to be executed,
 interval //period between successive task executions.)

interval 是包含时间的整数,以毫秒为单位

【讨论】:

  • 你得到的当前位置除以总数是多少?
  • 我明白了,getAdapterPosition() 从哪里得到它的值?
  • @AlanTodtenkopf 我试图让它无限循环,例如我有 3 个项目,并且 RV 滚动通过 i0 -> i1 -> i2。我希望它通过 i2 回到 i0。但是,如果我使用 'smoothScrollToPosition(0)' ,项目 2 和 1 会短暂闪烁。我试图避免这种情况并采用看起来像连续循环的方式。我希望这是有道理的。
  • @Ganesh 您的代码在加载最后一张卡之前一直有效,我不确定是否正确设置了 adapter.getAdapterPosition(),目前我已将其分配给一个值适配器中的一个类发回给我。使用 holder.getAdapterPosition(); 将返回的值分配给 onBindViewHolder;
  • @Ganesh 然后循环遍历所有以前的项目,直到它到达 i0 不是吗? - 我试图避免这种影响
【解决方案2】:

所以我尝试了很多方法来解决这个问题,首先,我尝试了@Ganesh 的答案,我对其进行了修改以开始工作。对于那些对此感兴趣的人是我所做的,

首先创建了一个定时器对象,以及延迟调度我创建的定时器任务。

块引用

timer.scheduleAtFixedRate(new AutoScrollTask(), 2000, 5000);

计时器任务使用 arraylist 计算出它的当前位置,当它到达末尾时,它只是保留,以避免突然跳转到第一项。

private class AutoScrollTask extends TimerTask{
        @Override
        public void run() {
            if(position == arrayList.size() -1){
                end = true;
            } else if (position == 0) {
                end = false;
            }
            if(!end){
                position++;
            } else {
                position--;
            }
            recyclerView.smoothScrollToPosition(position);
        }
    }

这个方法确实有它的缺陷,这就是我为什么接受@Tam Huynh 的建议并研究 ViewFlipper 的原因。然而,在这种情况下,我使用了 AdapterViewFlipper。 这使我能够构建一个自定义适配器,我可以在其中根据收到的数据动态添加视图。

【讨论】:

  • 我想我也同意这个说法,它似乎可行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多