ViewPager + PagerAdapter показывает пустые страницы после первых двух элементов

Что происходит: первые две страницы ViewPager загружены красиво (ViewPager автоматически загружает + -1 с текущей страницы). Когда вы прокручиваете их, следующие страницы не отображаются. GIF ниже описанной проблемы.

Отладочная информация. Страницы создаются (см. код ниже) и успешно добавляются в ViewPager ArrayList<ItemInfo>mItems (подтвержденные через сообщения журнала). Я перекомпилировал библиотеку android.support.v4 с параметром debug = true (mmm frameworks/support/v4/ в aosp), и он показывает все, что работает отлично. ЗА ИСКЛЮЧЕНИЕМ:

Методы onLayout и onMeasure в ViewPager перестают вызываться после загрузки первых двух представлений. Это означает, что другие страницы являются черными, потому что они никогда не были измерены и расположены так, как они должны были быть. Я попробовал добавить разные вызовы requestLayout() в разных точках, чтобы заставить обновление дерева макетов безрезультатно.

Фон. У меня есть ViewPager, созданный через inflater.inflate и найденный через view.findViewById(R.layouy.myid). Он непосредственно заменяет старый вид галереи, и для целей тестирования элемент instantagerItem PagerAdapter (коллекция, позиция) просто делает это:

@Override
public Object instantiateItem(View collection, final int position) {
    final TextView tv = new TextView(collection.getContext());
    tv.setText("Looking at page " + position);
    tv.setTextColor(Color.WHITE);
    tv.setBackgroundColor(Color.rgb( (int)(Math.random()*100), (int)(Math.random()*100), (int)(Math.random()*100)));
    tv.setTextSize(22);
    ((ViewPager) collection).addView(tv);
    return tv;
}

Любые идеи? Мне кажется, что некоторые настройки тайны в родителях PageView каким-то образом отключают onLayout PageView

Ответ 1

Найдена моя проблема. В родительском элементе родителя моего представления кто-то подклассифицировал LinearLayout и overrode requestLayout() без вызова super.requestLayout().

Это нарушило обновление моей иерархии представлений и помешало onMeasure и onLayout быть вызванным на моем ViewPager. Без измерения и размещения страниц, которые они отображали в ViewPager как пустое.

Надеюсь, это когда-нибудь поможет кому-то другому. Наверное, я навсегда сообразил.

PRO TIP: android-sdk/tools/hierarchyviewer невероятно. Спасибо команде Android. Каждый должен запускать его хотя бы один раз, он может быть неоценим при отладке и разработке чего-либо пользовательского интерфейса.