Подтвердить что ты не робот

ViewPager onPageSelected для первой страницы

Итак, кажется, что при использовании ViewPager прослушиватель onPageSelected не вызывается для первой страницы той же проблемы, что и this.

У меня есть некоторая логика, которая заполняет несколько более дорогих элементов пользовательского интерфейса для текущей выбранной страницы, и это работает при изменении страницы, но it doesn't work for the first page.

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

// Inside PagerAdapter.instantiateItem

ViewHolder vh = new ViewHolder();
cursor.moveToPosition(position);
vh.view = adapter.newView(context, cursor, null);
// Set position as tag so we can retrieve it with findViewByTag
vh.view.setTag(position); 

((ViewPager) collection).addView(vh.view,0);       

return vh;

// Inside MyActivity.onCreate

pagerAdapter = new SingleMessagePagerAdapter(this, cursor);
pager = (ViewPager)findViewById(R.id.message_pager);
pager.setAdapter(pagerAdapter);
pager.setOnPageSelectedListener(this);
pager.setCurrentItem(selectedItem);

// Inside MyActivity.onPageSelected

// Retrieve tagged view
View view = pager.findViewWithTag(position); 

Здесь view заканчивается как null, потому что PagerAdapter.instantiateItem еще не запущен. Итак, я думаю, мой вопрос в том, в какой момент жизненного цикла деятельности я могу быть уверен, что ViewPager инициализировал представление? Я пробовал делать это внутри Activity.onAttachedToWindow и Activity.onResume, но кажется, что оба они срабатывают до PagerAdapter.instantiateItem.

4b9b3361

Ответ 1

попробуйте использовать фрагменты!

public class SectionsPagerAdapter extends FragmentPagerAdapter {

    public SectionsPagerAdapter() {
        super(getSupportFragmentManager());
    }

    @Override
    public Fragment getItem(int i) {
        Fragment fr = null;
        if (i==0)
           fr = new sec0frag();
        else if (i==1)
           fr = new sec1frag();
        else if (i==2)
           fr = new sec2frag();
        return fr;
    }

    @Override
    public int getCount() {
        return 3;
    }
}

и создать 3 класса фрагментов

например.

    public static class sec0frag extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
                     // here is initialize for first time to view pages.!
        }
    }

Ответ 2

Мне интересно, почему у вас не просто логика, которую вы упоминаете в самом фрагменте, а не в хостинговой деятельности. ViewPager буферизует пару фрагментов с одной стороны от текущей, поэтому они настроены в фоновом режиме и готовы к работе, когда пользователь перебирает их. Включение логики в onPageSelected означало бы обходить эту функциональность и не делать тяжелую работу до тех пор, пока пользователь не проскочит на страницу.

Предполагая, что по какой-то причине вы не можете сделать выше, почему бы не использовать интерфейс с функцией обратного вызова. Запустите обратный вызов в функции фрагмента onCreateView, чтобы Мероприятие полностью узнало об этом.

Ответ 3

Моим решением было расширить адаптер пейджера и создать в нем интерфейс. Затем сделайте адаптер, чтобы вызвать интерфейс только один раз после создания адаптера. Внутри обратного вызова интерфейса вы можете вызывать метод onPageChanged без использования исключения nullpointer. Добавьте этот класс в свой проект и увеличьте его адаптер. Не забудьте установить прослушиватель для адаптера, прежде чем устанавливать адаптер на просмотрщик. Класс адаптера ниже:

public abstract class ExtendedPagerAdapter extends FragmentPagerAdapter {

private boolean instantiated;
private AdapterListener adapterListener;

public interface AdapterListener {
    void onAdapterInstantiated();
}

public ExtendedPagerAdapter(FragmentManager fragmentManager) {
    this(fragmentManager, null);
}

public ExtendedPagerAdapter(FragmentManager fragmentManager, AdapterListener adapterListener) {
    super(fragmentManager);
    this.adapterListener = adapterListener;
    instantiated = false;
}

@Override
public void finishUpdate(ViewGroup container) {
    super.finishUpdate(container);
    if (!instantiated) {
        instantiated = true;
        if (adapterListener != null) {
            adapterListener.onAdapterInstantiated();
        }
    }
}

public void setAdapterInstantiatedListener(AdapterListener adapterListener) {
    this.adapterListener = adapterListener;
}
}

Код операции:

adapter = new ViewPagerAdapter(getChildFragmentManager());
    adapter.setAdapterInstantiatedListener(new ExtendedPagerAdapter.AdapterListener() {
        @Override
        public void onAdapterInstantiated() {
            onPageSelected(viewPager.getCurrentItem());
        }
    });

    viewPager.addOnPageChangeListener(this);
    viewPager.setAdapter(adapter);