代码之家  ›  专栏  ›  技术社区  ›  Demonic218

自动循环视图滚动

  •  3
  • Demonic218  · 技术社区  · 7 年前

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

    我也看到有人在谈论viewflipper,但我从未使用过,也不确定它是否能达到预期效果。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Ganesh    7 年前

    首先,像这样创建一个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是包含时间(毫秒)的整数

        2
  •  1
  •   Community CDub    3 年前

    所以我尝试了很多方法来解决这个问题,首先,我尝试了@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。 这允许我构建一个自定义适配器,在那里我可以根据接收到的数据动态添加视图。