我遇到的问题是,只有当我使用OnPageChangeListener的onPageSelected方法时,ViewPager才会在某些设备上出现延迟。
这是听众:
public class SelectorChangeListener implements ViewPager.OnPageChangeListener {
@Override
public void onPageScrolled(int i, float v, int i2) {}
@Override
public void onPageScrollStateChanged(int i) {}
@Override
public void onPageSelected(int i) {
onLineSelected(mAdapter.getLinePalina(i));
}
}
这是onLineSelected方法:
/**
* Called when a line becomes selected
* @param linePalina LinePalina Object
*/
public void onLineSelected(LinePalina linePalina) {
if(D) Log.d(TAG, "Called: onLineSelected([linePalina])");
Palina palina = linePalina.palina;
Line line = linePalina.line;
mHeaderText.setText(palina.getName());
}
在适配器内部,这是getLinePalina(int)方法:
public LinesSelectorFragment.LinePalina getLinePalina(int position) {
return mLines.get(position);
}
mLines是LinePalina对象的简单ArrayList。
当我禁用OnPageChangeListener时,可能导致这种滞后的原因消失了吗?
修改: 我试图从OnPageChangeListener中删除任何行,所以现在它是空的,它被添加到ViewPager中,如下所示:
pager.setOnPageChangeListener(new SelectorChangeListener());
并且* 即使有一个空的监听器,ViewPager在某些设备上也是滞后的(Galaxy Tab 2 7.0)如果我注释掉那一行:
//pager.setOnPageChangeListener(new SelectorChangeListener());
viewpager工作得很好!!!这怎么可能?
答案 0 :(得分:0)
这是一个非常奇怪的错误。我在使用Android 4.2.1的通用移动发现设备上遇到了完全相同的情况。它在其他设备上完美运行,如三星Galaxy S3,Nexus 5等。
然后,在调试时我发现onPageScrolled
被调用了很多次。事实上,如果用户将手指放在屏幕上并保持滑动而不将手指从屏幕上移开,则会被称为无限次。我在onPageScrolled
方法中更改了TextView的文本,并且由于该方法被多次调用,因此导致了非常滞后的行为。我设法解决了这个问题:
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
int lastScrolledPagePosition = 0;
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
if(position != lastScrolledPagePosition) {
txtImageCount.setText(position + 1 + "/" + imageUrls.size());
lastScrolledPagePosition = position;
}
}
@Override
public void onPageSelected(int position) {}
@Override
public void onPageScrollStateChanged(int state) {}
});
希望这有助于有同样问题的人。