1

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

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 位置时,它会出现向后动画。如何实现。

4

1 回答 1

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

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

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

更新

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

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

  • 称呼yourAdapter.notifyDataSetChanged()

  • 然后重新添加新的片段。如果已经添加了现有片段的问题,请根据该片段的内容创建一个新片段。

  • 重拨yourAdapter.notifyDataSetChanged()

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

于 2019-12-20T16:29:02.133 回答