OnPageChangeListener使ViewPager滞后

时间:2013-12-07 16:10:59

标签: android android-viewpager

我遇到的问题是,只有当我使用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工作得很好!!!这怎么可能?

1 个答案:

答案 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) {}
});

希望这有助于有同样问题的人。