【问题标题】:Endless auto scroll view pager with page indicator带页面指示器的无尽自动滚动视图寻呼机
【发布时间】:2019-03-10 18:36:07
【问题描述】:

我必须构建具有无限自动滚动功能的视图寻呼机。我还需要在视图寻呼机下方显示一个页面指示器,它应该根据滚动事件做出响应。我目前已经为无限自动滚动应用了以下逻辑:

public void setupAutoPager(final int size) { final Handler handler = new Handler();

    final Runnable update = new Runnable() {
        public void run() {
            promotionViewPager.setCurrentItem(currentPage);
            if (currentPage >= size - 1) {
                currentPage = 0;
            } else {
                ++currentPage;
            }
        }
    };

    Timer timer = new Timer();
    timer.schedule(new TimerTask() {

        @Override
        public void run() {
            handler.post(update);
        }
    }, 500, 2500);
}

问题:当第一项从自动滚动的最后一项再次出现时,视图寻呼机的动画在再次到达位置时向后方向(看起来像在返回时闪烁),而当从第一个元素自动滚动到第二个元素时,则动画前进方向(进入下一个元素)。我希望动画应该始终向前。当我将当前视图寻呼机项目设置为 0 位置时,它会出现向后动画。如何实现。

【问题讨论】:

    标签: android android-viewpager autoscroll endlessscroll


    【解决方案1】:

    我知道这篇文章已经发布了几个月,但我是构建 Android 应用程序的初学者,我也面临同样的问题。 我会尝试以下方法,即使它看起来绝对不是最佳的......

    1. 在您的适配器类中构建一个数组,其中将包含您的所有片段。
    2. 使用要显示的片段填充此数组。诀窍是在列表末尾添加第一个片段并在 ViewPager 完成更改后将其删除。
    3. 用您的数组覆盖以下方法getItem(int position)getCount()return yourFragmentArray.get(position); & return yourFragmentArray.size();
    4. 我们的想法是一遍又一遍地用相同的片段填充ViewPager(如果需要,还可以添加新的片段)并删除你用来填充 VP 的片段,这样你就永远不会回去了。
    5. 因此,如果我采用您的代码,我会这样做:
    
    private int size = yourFragmentArray.size();
    
    public void setupAutoPager(final int size) {
    
        final Handler handler = new Handler();
    
        currentPage = promotionViewPager.getCurrentItem();
    
        final Runnable update = new Runnable() {
            public void run() {
                if (currentPage == size - 1) {
    
                    // Add the fragment to your fragmentArray
                    // Only the rank 0 needs to be taking care, works like in queue
    
                    yourFragmentArray.add(yourFragmentArray.get(0));
    
                    // Notify the changes made
                    yourAdapter.notifyDataSetChanged();
    
                    // Set the next item 
                    promotionViewPager.setCurrentItem(currentPage + 1);
    
                    yourFragmentArray.remove(0); 
    
                    // Update the size 
                    size += 1;             
    
                } 
                else {
                     promotionViewPager.setCurrentItem(currentPage + 1);
                }  
            }
        };
    
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
    
            @Override
            public void run() {
                handler.post(update);
            }
        }, 500, 2500);
    }
    

    逻辑对我来说就在这里,这可能不是最好的方法,但我现在看不到另一个。

    祝你好运!一旦我可以自己测试,我会更新这篇文章。

    更新

    一个更好的方法是添加这个方法:

    • 在调用方法之前将 ViewPager 的大小保存到特定变量firstMaxSize
    • 使用计数器(如果这是您第一次循环通过适配器片段,我们不会删除它们),但if(counter != 0) 我们将循环通过 yourFragmentArray() 并从 0 删除到 firstMaxSize .

    • 致电yourAdapter.notifyDataSetChanged()

    • 然后重新添加新的片段。如果已经添加了已有的fragment的问题,就根据这个fragment的内容新建一个fragment。

    • 再次拨打yourAdapter.notifyDataSetChanged()

    确实很重,我很确定还有另一种最简单的方法,但还没有找到。

    【讨论】:

      猜你喜欢
      • 2021-12-25
      • 1970-01-01
      • 2012-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多