Android ViewPager получает текущий вид

У меня есть ViewPager, и я хотел бы получить текущий выбранный и видимый вид, а не позицию.

  1. getChildAt(getCurrentItem) возвращает неправильный View
  2. Это работает не все время. Иногда возвращает ноль, иногда просто возвращает неправильный вид.

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
    
        if (isVisibleToUser == true) { 
            mFocusedListView = ListView; 
        }
    }
    
  3. PageListener на ViewPager с getChildAt() также не работает, не давая мне каждый раз правильный просмотр.

Как я могу получить текущий видимый вид?

View view = MyActivity.mViewPager.getChildAt(MyActivity.mViewPager.getCurrentItem()).getRootView();
ListView listview = (ListView) view.findViewById(R.id.ListViewItems);

Ответ 1

Я понял это. То, что я сделал, это вызвал setTag() с именем для всех View/ListView, и просто вызвал findViewWithTag(mytag), mytag был тегом.

К сожалению, нет другого способа решить эту проблему.

Ответ 2

Я только что наткнулся на ту же проблему и разрешил ее, используя:

View view = MyActivity.mViewPager.getFocusedChild();

Ответ 3

Вы можете получить текущий элемент, обратившись к своему списку itens из вашего адаптера, вызывающего myAdapter.yourListItens.get(myViewPager.getCurrentItem()); Как вы можете видеть, ViewPager может получить текущий индекс элемента вашего адаптера (текущая страница).

Если вы используете FragmentPagerAdapter, вы можете сделать это:

FragmentPagerAdapter adapter = (FragmentPagerAdapter)myViewPager.getAdapter();

и вызовите

adapter.getItem(myViewPager.getCurrentItem());

Это очень хорошо для меня;)

Ответ 4

Используйте адаптер, расширяющий PagerAdapter, и переопределите метод setPrimaryItem внутри вашего PagerAdapter.

https://developer.android.com/reference/android/support/v4/view/PagerAdapter.html

class yourPagerAdapter extends PagerAdapter
{
    // .......

    @Override
    public void setPrimaryItem (ViewGroup container, int position, Object object)
    {
        int currentItemOnScreenPosition = position;
    }

    // .......

}

Ответ 5

Во время моих попыток найти способ украсить андроид-представления, я думаю, что я определил альтернативное решение для той проблемы OP, которую я зарегистрировал в мой блог, Я связываюсь с ним, поскольку код, кажется, немного слишком много для включения всего здесь.

Решение, которое я предлагаю:

  • полностью отключает адаптер и вид.
  • можно легко запросить представление с любой формой индекса пейджера представления, и он будет возвращен либо null, если это представление в настоящее время не загружено, либо соответствующее представление.

Ответ 6

- это ваше первое действие на экране или вы уже многоуровневали друг над другом?

попробуйте следующее:

findViewById(android.R.id.content).getRootView()

или просто:

findViewById(android.R.id.content) 

также зависит от того, что вы хотите попробовать:

((ViewGroup)findViewById(android.R.id.content)).getChildAt(0)

Ответ 7

как это происходит для всех y'all?

public Object instantiateItem(final ViewGroup container, final int position) {      
    CustomHomeView RL = new CustomHomeView(MainActivity.ctxt);
    if (position==0){
        container.setId(R.id.home_container);} ...rest of code

то вот код для доступа к вашей странице

((ViewGroup)pager.findViewById(R.id.home_container)).getChildAt(pager.getCurrentItem()).setBackgroundColor(Color.BLUE);

Если вы хотите, вы можете настроить маленький meathod

RelativeLayout getPageAt(int index){
    RelativeLayout rl =  ((RelativeLayout)((ViewGroup)pager.findViewById(R.id.home_container)).getChildAt(index));
    return rl;
}

Ответ 8

Попробуйте это

 final int position = mViewPager.getCurrentItem();
    Fragment fragment = getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.rewards_viewpager + ":"
            + position);

Ответ 9

Мне пришлось сделать это более общее, поэтому я решил использовать частную "позицию" ViewPager.LayoutParams

        final int childCount = viewPager.getChildCount();
        for (int i = 0; i < childCount; i++) {
            final View child = viewPager.getChildAt(i);
            final ViewPager.LayoutParams lp = (ViewPager.LayoutParams) child.getLayoutParams();
            int position = 0;
            try {
                Field f = lp.getClass().getDeclaredField("position");
                f.setAccessible(true);
                position = f.getInt(lp); //IllegalAccessException
            } catch (NoSuchFieldException | IllegalAccessException ex) {ex.printStackTrace();}
            if (position == viewPager.getCurrentItem()) {
                viewToDraw = child;
            }
        }

Ответ 11

Вы можете найти фрагмент по системному тегу. Это работает для меня. Я использовал это в функции OnMeasure.

id - id viewPager

position - фрагмент, который вы хотите получить

Важный! Вы получите этот фрагмент, если ваш фрагмент был создан в адаптере. Поэтому вы должны проверить supportedFragmentManager.findFragmentByTag("android:switcher:" + id + ":" + position) обнулить

Вы можете получить вид, как это:

supportedFragmentManager.findFragmentByTag("android:switcher:" + id + ":" + position).view

Вы не должны давать пользовательский тег в адаптере

Ответ 12

Я использую этот метод с android.support.v4.view.ViewPager

View getCurrentView(ViewPager viewPager) {
        try {
            final int currentItem = viewPager.getCurrentItem();
            for (int i = 0; i < viewPager.getChildCount(); i++) {
                final View child = viewPager.getChildAt(i);
                final ViewPager.LayoutParams layoutParams = (ViewPager.LayoutParams) child.getLayoutParams();

                Field f = layoutParams.getClass().getDeclaredField("position"); //NoSuchFieldException
                f.setAccessible(true);
                int position = (Integer) f.get(layoutParams); //IllegalAccessException

                if (!layoutParams.isDecor && currentItem == position) {
                    return child;
                }
            }
        } catch (NoSuchFieldException e) {
            Log.e(TAG, e.toString());
        } catch (IllegalArgumentException e) {
            Log.e(TAG, e.toString());
        } catch (IllegalAccessException e) {
            Log.e(TAG, e.toString());
        }
        return null;
    }

Ответ 13

Пожалуйста, проверьте это

((ViewGroup))mViewPager.getChildAt(MyActivity.mViewPager.getCurrentItem()));

else проверьте эту ссылку.

Ответ 14

Если вы внимательно изучите, на ViewPager будет сохранено не более 3 просмотров. Вы можете легко получить текущий вид

view     = MyActivity.mViewPager.getChildAt(1);