带页面指示器的无尽自动滚动视图寻呼机

时间:2019-03-10 18:36:08

标签: android android-viewpager autoscroll endlessscroll

我必须使用无休止的自动滚动功能来构建视图寻呼机。另外,我需要在视图寻呼机下方显示一个页面指示器,该指示器应根据滚动事件进行响应。我目前为无尽的自动滚动应用了以下逻辑:

public void setupAutoPager(最终int大小){         最终处理程序处理程序= 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位置时,会出现向后动画。如何实现。

1 个答案:

答案 0 :(得分: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()

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

  • 再次致电yourAdapter.notifyDataSetChanged()

确实非常沉重,我很确定存在另一种最简单的方法,但尚未找到它。