it-swarm.com.ru

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);
55
lacas

Я понял это. Что я сделал, так это позвонил setTag() с именем для всех Views/ListViews и просто вызвал findViewWithTag(mytag), mytag в качестве тега.

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

111
lacas

Я только что столкнулся с той же проблемой и решил ее с помощью:

View view = MyActivity.mViewPager.getFocusedChild();
8
ZeCodea

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

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

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

и позвонить

adapter.getItem(myViewPager.getCurrentItem());

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

7
Gilian

Используйте адаптер, расширяющий 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;
    }

    // .......

}
3
Andrés

как это разыгрывается для всех вас?

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);

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

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

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

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

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

это ваше первое занятие на экране, или вы уже расположили несколько слоев друг над другом?

попробуй это:

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

или просто:

findViewById(Android.R.id.content) 

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

((ViewGroup)findViewById(Android.R.id.content)).getChildAt(0)
1
SunnySonic

Попробуй это 

 final int position = mViewPager.getCurrentItem();
    Fragment fragment = getSupportFragmentManager().findFragmentByTag("Android:switcher:" + R.id.rewards_viewpager + ":"
            + position);
1
Son Nguyen Thanh

Я должен был сделать это более общим, поэтому я решил использовать приватную «позицию» 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;
            }
        }
1
Kamen Dobrev

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

id - идентификатор ViewPager 

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

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

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

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

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

0

Я использую ViewPagerUtils из FabulousFilter

ViewPagerUtils.getCurrentView(ViewPager viewPager)
0
Aleksandar Acić