Android 无休止的ViewPager:setCurrentItem(int pos)在新位置小于当前位置至少2时阻止UI
当我调用Android 无休止的ViewPager:setCurrentItem(int pos)在新位置小于当前位置至少2时阻止UI,android,android-viewpager,endlessadapter,Android,Android Viewpager,Endlessadapter,当我调用ViewPager上的setCurrentItem(int pos)方法时,如果新位置小于当前位置至少2,则UI将被阻止。如果新位置小于1或大于旧位置,ViewPager工作正常。出于测试目的,我将max number更改为300,UI未被阻止。它看起来像是ViewPager遍历items count以匹配新位置,在我的例子中item count是Integer.MAX\u VALUE。UI块持续约20-30秒,然后正确地转到所需位置。这是适配器 public class DateCou
ViewPager
上的setCurrentItem(int pos)
方法时,如果新位置小于当前位置至少2,则UI
将被阻止。如果新位置小于1或大于旧位置,ViewPager
工作正常。出于测试目的,我将max number更改为300,UI
未被阻止。它看起来像是ViewPager
遍历items count以匹配新位置,在我的例子中item count是Integer.MAX\u VALUE
。UI
块持续约20-30秒,然后正确地转到所需位置。这是适配器
public class DateCountVPAdapter extends FragmentStatePagerAdapter {
public DateCountVPAdapter(Date startDate, FragmentManager fm) {
super(fm);
this.startDate = startDate;
calendar = Calendar.getInstance();
calendar.setTime(startDate);
}
private Date startDate;
private Calendar calendar;
@Override
public DateCountVPFragment getItem(int position) {
Calendar currentDate = (Calendar)calendar.clone();
currentDate.add(Calendar.DAY_OF_MONTH, position);
return DateCountVPFragment.newInstance(startDate, currentDate.getTime());
}
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
}
我还尝试扩展
ViewPager
并修改setCurrentItem(intpos)
方法,但是有一些私有方法无法做到这一点。我还试图复制这个类,但是PagerAdapter
出现了一个问题,它使用了ViewPager
使用的包私有方法。请提供任何避免UI
阻塞的解决方案。提前感谢。默认情况下,setCurrentItem(int-pos)
隐式调用,如果ViewPager
已使用当前适配器完成其第一次布局,则视图转换应设置为平滑滚动的动画。因此,您的一些时间锁定可能来自ViewPager
试图在屏幕之间绘制平滑滚动,尤其是在转换过程中必须创建片段的情况下
您的第一步应该是使用setCurrentItem(int-pos,boolean-smoothScroll)
,除非您真正关心平滑滚动。谢谢您的支持,但这与转换无关,我已经尝试过了。它实际上挂在以下循环中的populate(int newCurrentItem)
ViewPager的方法中:for(int pos=mCurItem+1;pos
其中N
是Integer.MAX\u值
。我想我会使用RecyclerView
来代替。。。如果在ViewPager
中检查新位置是否小于旧位置会更好,以便使用反向循环。如果必须使用ViewPager,我建议使用较小的值。您可以比Integer.MAX_值小很多,但最终用户仍然可以看到无休止的滚动。我最近有一个类似的例子,它是许多物品的旋转木马,收集大小为*1000。它比max int小得多,这导致遍历所需的时间要小得多。在日历中,假设从MaxInt/2开始,每个方向都有将近300万年。