Intereting Posts
Android getMaxAddressLineIndex возвращает 0 для строки 1 Android: распространять родительское состояние на дочерний режим Как программно установить время обнаружения без подтверждения пользователя? StopSelf не останавливает мое обслуживание Как изменить цвет панели выбора текста, который появляется при копировании текста? Material Design – панель инструментов AppCompat, не отображающая тень Фрагмент: вызов обратного вызова при нажатии кнопки возврата и его настройка ListView в ArrayAdapter order get смешивается при прокрутке ProgressDialog.dismiss () не работает Случайно удаленный файл макета Android Android – Получить MIME-тип из файла без расширения Отступы, потерянные с помощью тега <merge> с пользовательским составным компонентом Android. Как мне динамически установить имя пакета во время сборки для проекта с открытым исходным кодом? Как добавить изображение в панель инструментов Андроид createTempFile запрещает отклонять разрешения?

Android ViewPager бросает исключение IndexOutOfBounds при настройке текущего элемента / страницы

У меня есть ViewPager с тремя элементами. Я пытаюсь установить ViewPager для просмотра страницы, наиболее удаленной справа (которая будет вторым элементом). Это возвращает исключение IndexOutOfBounds, хотя я знаю, что индекс должен быть в границах. Вот точный стек:

02-22 12:22:50.256: E/AndroidRuntime(384): FATAL EXCEPTION: main 02-22 12:22:50.256: E/AndroidRuntime(384): java.lang.IndexOutOfBoundsException: index=1 count=0 02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.ViewGroup.addInArray(ViewGroup.java:2050) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.ViewGroup.addViewInner(ViewGroup.java:1994) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.ViewGroup.addViewInLayout(ViewGroup.java:1958) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.ViewGroup.addViewInLayout(ViewGroup.java:1939) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.support.v4.view.ViewPager.addView(ViewPager.java:917) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.ViewGroup.addView(ViewGroup.java:1828) 02-22 12:22:50.256: E/AndroidRuntime(384): at us.tagverse.pagertest.MasterActivity$PAdapter.instantiateItem(MasterActivity.java:518) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.support.v4.view.PagerAdapter.instantiateItem(PagerAdapter.java:110) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:649) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.support.v4.view.ViewPager.populate(ViewPager.java:783) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1016) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.View.measure(View.java:8313) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1017) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.widget.LinearLayout.measureVertical(LinearLayout.java:386) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.widget.LinearLayout.onMeasure(LinearLayout.java:309) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.View.measure(View.java:8313) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.View.measure(View.java:8313) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.View.measure(View.java:8313) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.ViewRoot.performTraversals(ViewRoot.java:839) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.ViewRoot.handleMessage(ViewRoot.java:1859) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.os.Handler.dispatchMessage(Handler.java:99) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.os.Looper.loop(Looper.java:123) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.app.ActivityThread.main(ActivityThread.java:3683) 02-22 12:22:50.256: E/AndroidRuntime(384): at java.lang.reflect.Method.invokeNative(Native Method) 02-22 12:22:50.256: E/AndroidRuntime(384): at java.lang.reflect.Method.invoke(Method.java:507) 02-22 12:22:50.256: E/AndroidRuntime(384): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 02-22 12:22:50.256: E/AndroidRuntime(384): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 02-22 12:22:50.256: E/AndroidRuntime(384): at dalvik.system.NativeStart.main(Native Method) 

Обратите внимание, что причиной является java.lang.IndexOutOfBoundsException: index=1 count=0 . Это означало бы, что количество страниц / элементов равно 0, а индекс, который я запрашиваю, равен 1. Ни одна из этих вещей не верна. Вот как я вызываю свой ViewPager и запрашиваю данную страницу:

 ViewPager pager = (ViewPager) findViewById(R.id.ma_viewcontainer); PAdapter adapter = new PAdapter(); pager.setAdapter(adapter); pager.setCurrentItem(2); 

Обратите внимание, что этот вызов не дает никакой ошибки и правильно устанавливает текущий элемент в средний элемент (индекс 1):

 ViewPager pager = (ViewPager) findViewById(R.id.ma_viewcontainer); PAdapter adapter = new PAdapter(); pager.setAdapter(adapter); pager.setCurrentItem(1); 

У меня есть счет из 3 пунктов в пейджере просмотра. Вот мой полный класс PAdapter, который расширяет класс PagerAdapter:

 private class PAdapter extends PagerAdapter implements TitleProvider { private int COUNT = 3; private static final int SETTINGS_ACTIVITY = 0; private static final int MAIN_ACTIVITY = 1; private static final int FRIEND_LIST_ACTIVITY = 2; @Override public int getCount() { return COUNT; } @Override public Object instantiateItem(View collection, int position) { LinearLayout layout = new LinearLayout(getApplicationContext()); LayoutInflater inflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); switch(position) { case MAIN_ACTIVITY : layout = (LinearLayout) inflater.inflate(R.layout.main, null, false); initMainLayout(layout); break; case SETTINGS_ACTIVITY : layout = (LinearLayout) inflater.inflate(R.layout.settings, null, false); initSettingsLayout(layout); break; case FRIEND_LIST_ACTIVITY : layout = (LinearLayout) inflater.inflate(R.layout.friend_list, null, false); initFriendListLayout(layout); break; } ((ViewPager)collection).addView(layout, position); return layout; } @Override public void destroyItem(View collection, int position, Object view) { ((ViewPager)collection).removeView((LinearLayout)view); } @Override public boolean isViewFromObject(View v, Object o) { return v == (LinearLayout)o; } @Override public void finishUpdate(View arg0) { //no need } @Override public void restoreState(Parcelable arg0, ClassLoader arg1) { //no need } @Override public Parcelable saveState() { return null; } @Override public void startUpdate(View arg0) { //no need } @Override public String getTitle(int position) { Resources res = getApplicationContext().getResources(); switch(position) { case MAIN_ACTIVITY : return res.getString(R.string.app_name); case SETTINGS_ACTIVITY : return res.getString(R.string.settings); case FRIEND_LIST_ACTIVITY : return res.getString(R.string.friend_list); default : return null; } } } 

Коллекция линий ((ViewPager)collection).addView(layout, position); Вызывает сбой.

Как видите, три предмета. Использование setCurrentItem () с параметром 0 или 1 работает просто отлично, но 2 вызывает эту странную ошибку. У меня заканчиваются идеи, чтобы решить эту проблему … К сожалению, ViewPager находится в некоторых неизведанных водах Android. Если у кого-то есть представление о том, как это решить, это будет очень признательно. Благодаря!

EDIT: Согласно предложению Шерифа, я попытался зарегистрировать счетчик child через collection.getChildCount () и получил следующий результат:

 02-22 15:20:42.274: E/children count(645): count: 0 02-22 15:20:42.454: E/children count(645): count: 1 02-22 15:20:42.594: E/children count(645): count: 2 

Это интересно. Это говорит о том, что он создает пустой PagerAdapter и добавляет их по одному. instantiateItem() вызывается 3 раза для трех видимых видов (в центре, влево и вправо). Поэтому я добавил этот блок кода внутри метода instantiateItem() :

 if(((ViewPager)collection).getChildCount() == 2) { ((ViewPager)collection).setCurrentItem(2); } 

Таким образом, только если счетчик установлен равным 2, он установит страницу на 2 (это хакерское решение, которое не полностью решает проблему, но стоило попробовать). У меня есть аналогичный стек ошибок, который указал сначала на строку: ((ViewPager)collection).setCurrentItem(2); , Затем ((ViewPager)collection).addView(layout, position); ,

Надеюсь, это поможет дать некоторое представление.

Solutions Collecting From Web of "Android ViewPager бросает исключение IndexOutOfBounds при настройке текущего элемента / страницы"

Я не думаю, что вы можете просто сделать ((ViewPager)collection).addView(layout, position) . Это зависит от вашего лимита на странице, который по умолчанию равен 1, я считаю. Я предполагаю, что вы используете только 3 вида, поэтому вы можете сделать что-то вроде viewPager.setOffscreenPageLimit(3); В вашем `onCreate (или везде, где вы разместили свой звонок), чтобы каждый обновляемый просмотр не обновлялся каждый раз, когда вы его оставляете.

Вы увидите в нескольких учебниках, что ((ViewPager) collection).addView(view, 0); Используется в instantiateItem() . За последние несколько недель я немного ViewPagers с ViewPagers и использовал 0 в качестве позиции -all- время, похоже, работает нормально.

Я вижу журнал сбоев, я вижу, что он падает в экземпляре элемента. Я не знаю, какая строка именно потому, что у меня нет номеров строк

Но если бы я был игроком ставок, я бы поспорил, что:

  ((ViewPager)collection).addView(layout, position); 

Сбой при попытке добавить вид в позицию 1, в то время как в коллекции нет страниц. Возможно, проверьте collection.getchildcount() (возможно, имя метода неверно) и вставьте в max (position, count)

Т.е. заменить позицию на:

 count > position ? position : count 

РЕДАКТИРОВАТЬ:

 ((ViewPager)collection).addView(layout, ((ViewPager)collection).getChildCount() > position ? position : ((ViewPager)collection).getChildCount()) 

Ps Проводка с моего телефона извиняется за ужасное форматирование

Пожалуйста отметьте

  02-22 12:22:50.256: E/AndroidRuntime(384): at us.tagverse.pagertest.MasterActivity$PAdapter.instantiat MasterActivity.java:518 

Номер в конце строки, которую я скопировал, и выясню, какая из них это тогда, и только тогда вы узнаете, какая строка попала в крушение

EDIT: PS о вашем решении

Я думаю, ваше решение только устанавливает текущий элемент после того, как 3 страницы были созданы экземпляром элемента, но моя строка заставит его работать, даже если они не будут созданы.