8

我正在使用来自 Android 支持 v13 的 ViewPager,我想使用 滚动到特定项目setCurrentItem(int),但是当我尝试滚动超过 2 个页面时,应用程序冻结,几秒钟后系统显示 ANR 窗口。

我尝试使用 来增加屏幕外屏幕限制setOffscreenPageLimit(2),这样当我尝试滚动 2 页时它不会冻结,但对 3 页执行相同操作。

我的问题是我的片段非常消耗内存,所以我不希望有太多的内存。我在支持库 v4 中使用了相同的代码,但我必须将其更新到 v13 才能使用NotificationCompat.Builder.addAction(int, CharSequence, PendingIntent).

你们中的任何人都知道可能是什么问题,可能是什么解决方案?

4

3 回答 3

22

您的适配器是否处理大量物品?(非常大 > ~2 20项)

ViewPager.populate(int)将从当前项目位置循环到N,这是适配器中的项目数 - 因此,如果您将其设置为较大的值(例如Integer.MAX_VALUE),这将需要一些时间,但最终会完成。

如果是这种情况,请搜索与“无尽寻呼机”相关的问题,例如Endless ViewPager android,或将项目数量限制在对主线程合理的范围内。

于 2014-01-26T12:32:33.673 回答
1

我遇到过同样的问题。我用于PagerAdapter无限滚动。

public static final int INITIAL_OFFSET = 1000;
@Override
    public int getCount() {
        return Integer.MAX_VALUE / 2;
}

ViewPager以这种方式开始:

viewPager.setCurrentItem(INITIAL_OFFSET);

所以为了摆脱冻结我写了一个小函数:

private void movePagerToPosition(int position) {
        int current = viewPager.getCurrentItem();
        int sign = current > position ? -1: 1;
        while (viewPager.getCurrentItem() != position){
            viewPager.setCurrentItem(viewPager.getCurrentItem() + sign, true);
        }
 }
于 2017-11-30T06:57:05.493 回答
0

我有这个问题。将以下方法添加到自定义 viewPager 并使用它。

private void setupCurrentItem(int cur)
    {
        try
        {
            Class<?> viewpager = ViewPager.class;
            Field mCurItemField = viewpager.getDeclaredField("mCurItem");
            mCurItemField.setAccessible(true);
            mCurItemField.set(this, cur);
        }
        catch (Exception ignored) {}
    }


setupCurrentItem(100);
setCurrentItem(100, false);
于 2019-07-15T08:32:20.383 回答