Не удалось получить текущий просмотр в Viewpager

Я использую viewpager для отображения текста на нескольких страницах. Я пытаюсь получить текущее представление, я выбираю новую страницу. Причина, по которой я хочу получить текущее представление, заключается в том, что на основе номера страницы я меняю некоторые свойства некоторых компонентов вида, таких как textview, изображение и т. Д. Я использую приведенный ниже код для того же

ViewPager mPager = (ViewPager) findViewById(R.id.pager); mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager()); mPager.setAdapter(mPagerAdapter); View CurrView; OnPageChangeListener pageChangelistener = new OnPageChangeListener() { @Override public void onPageSelected(int pageSelected) { currView = mPager.getChildAt(mPager.getCurrentItem()); myTextView = (TextView)currView.findViewById(R.id.myTextView); loadBookmarkSetting(pageSelected);//do some changes in myTextView properties based on the page number } mPager.setOnPageChangeListener(pageChangelistener); 

Теперь проблема, с которой я столкнулся, после того, как я прокрутил 3 страницы, и когда я прихожу на 4-ю страницу, я получаю исключение nullpointer в строке «myTextView = (TextView) currView.findViewById (R.id.myTextView);». Это так, потому что currView имеет значение null. Любые идеи, если я делаю что-то неправильно здесь. Есть ли другой способ захвата текущего представления (страницы) в viewpager, так как я могу делать изменения в представлении, основываясь на том, на каком номере страницы я нахожусь?

Solutions Collecting From Web of "Не удалось получить текущий просмотр в Viewpager"

Вы можете использовать setTag с представлением, которое вы возвращаете в методе instantiateItem (PagerAdapter).

Итак, когда вы создаете свои представления в PagerAdapter, этот метод также является instantiateItem(ViewGroup container, int position)) , вы должны использовать setTag для вашего представления.

Как это:

 view.setTag("myview" + position); return view; 

Когда вам нужен текущий вид:

 View view = (View) pager.findViewWithTag("myview" + pager.getCurrentItem()); 

Вы используете такой подход:

 @Nullable public static View getActiveView(@Nonnull final ViewPager viewPager) { final PagerAdapter adapter = viewPager.getAdapter(); if (null == adapter || adapter.getCount() == 0 || viewPager.getChildCount() == 0) { return null; } int position; final int currentPosition = viewPager.getCurrentItem(); for (int i = 0; i < viewPager.getChildCount(); i++) { final View child = viewPager.getChildAt(i); final LayoutParams layoutParams = (LayoutParams) child.getLayoutParams(); if (layoutParams.isDecor) { continue; } final Field positionField; try { positionField = LayoutParams.class.getDeclaredField("position"); positionField.setAccessible(true); position = positionField.getInt(layoutParams); } catch (NoSuchFieldException e) { break; } catch (IllegalAccessException e) { break; } if (position == currentPosition) { return child; } } return null; } 

Причина, по которой ваше текущее представление имеет значение null, заключается в том, что адаптер пейджера начинает уничтожать свои элементы для целей экономии памяти. Один из способов, который я нашел, будет заключаться в том, чтобы переопределить метод destroyItem () для адаптера пейджера и сохранить ваши данные либо через список, либо с помощью класса parceable.