如何停止自动旋转ViewPager listview项目?

时间:2018-02-19 21:37:12

标签: android listview handler

我有一个包含ViewPager的listview项。以下代码位于我创建的方法中,其目的是允许ViewPager自动滑动。

但是,当视图滚出屏幕时,runnable会一直调用自己并滚动。在包含其中几个的列表视图中,这些回调即使在屏幕外也会被调用。

什么是跟踪每个listview的处理程序的模式,当它不再在屏幕上时取消它?当它回到屏幕上时我也必须重新启用。

谢谢!

    // Inside getView() in my adapter

    if (autoSlide) {

        final int autoSlideDelayMs = 5000;

        final Handler handler = new Handler();

        // Attach handler ref to ViewPager so later we can stop this.
        viewPager.setTag(handler);

        final Runnable scrollRunnable = new Runnable() {
            public void run() {
                final int currentItem = viewPager.getCurrentItem();
                final int itemCount = viewPager.getAdapter().getCount();
                final int itemToShow = currentItem == itemCount - 1 ? 0 : viewPager.getCurrentItem() + 1;
                viewPager.setCurrentItem(itemToShow, true);

                if (handler != null) {
                    handler.postDelayed(this, autoSlideDelayMs);
                }
            }
        };
        handler.postDelayed(scrollRunnable, autoSlideDelayMs);
    }

我也做了以下事情。这可能不是最好的编码实践,但我试图保留对处理程序的引用,并在我不再发生自动滑动时使其为空。

    // In my fragment
    listview.setRecyclerListener(new AbsListView.RecyclerListener() {
        @Override
        public void onMovedToScrapHeap(View view) {
            final ExtendedViewPager viewPager = (ExtendedViewPager)view.findViewById(R.id.pager);
            if (viewPager != null) {
               Handler h = (Handler)viewPager.getTag();

                if (h != null) {
                    h = null;
                    System.gc();
                }
            }
        }
    });

1 个答案:

答案 0 :(得分:0)

我选择在View Pager中使用标记来指示滚动是否应该继续(并且不将Hander设置为标记对象)。所以我的代码现在就像:

在片段中:

/**
 *
 */
@Override
public void onDestroyView() {
    super.onDestroyView();

    // Stop any autosliding slideshow listview items
    final int childCount = listview.getChildCount();
    int currentChild = 0;

    while(currentChild < childCount) {
        stopAutoSliding(listview.getChildAt(currentChild++));
    }
}


/**
 * Set a tag to the view pager to indicate autosliding should stop
 */
private void stopAutoSliding(final View view) {
    final View viewPager = view.findViewById(R.id.pager);
    if (viewPager != null) {
        viewPager.setTag(new Object());
    }
}

在适配器中:

    if (autoSlide) {

        final int autoSlideDelayMs = 5000;

        final Handler handler = new Handler();

        final Runnable scrollRunnable = new Runnable() {
            public void run() {
                final int currentItem = viewPager.getCurrentItem();
                final int itemCount = viewPager.getAdapter().getCount();
                final int itemToShow = currentItem == itemCount - 1 ? 0 : viewPager.getCurrentItem() + 1;
                viewPager.setCurrentItem(itemToShow, true);

                // If the viewPager has a tag, it means we shouldn't keep scrolling.
                final Object continueSliderFlag = viewPager.getTag();

                if (continueSliderFlag == null) {
                    handler.postDelayed(this, autoSlideDelayMs);
                }
            }
        };
        handler.postDelayed(scrollRunnable, autoSlideDelayMs);
    }