我有一个包含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();
}
}
}
});
答案 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);
}