Фрагмент обновления Android ViewPager

В моем приложении есть 2 вкладки (библиотека поддержки дизайна Android), это фрагмент с ViewPagerAdapter:

public class ListaCanali extends Fragment {

public static TabLayout tabLayout;
public static ViewPager viewPager;
public static int int_items = 2 ;

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View v =inflater.inflate(R.layout.lista_canali, container,false);

    //Titolo Fragment
    ((MainActivity) getActivity()).setActionBarTitle("Lista Canali");

    //FindViewById
    tabLayout = (TabLayout) v.findViewById(R.id.tabs);
    viewPager = (ViewPager) v.findViewById(R.id.viewpager);

    //Funzioni Tab
    viewPager.setAdapter(new MyAdapter(getChildFragmentManager()));
    tabLayout.post(new Runnable() {
        @Override
        public void run() {
            tabLayout.setupWithViewPager(viewPager);
        }
    });

    return v;
}


//Adattatore Tab
class MyAdapter extends FragmentPagerAdapter {

    public MyAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position)
    {
        switch (position){
            case 0 : return new FragmentCanali();
            case 1 : return new FragmentPreferiti();
        }
        return null;
    }

    public int getCount() {

        return int_items;

    }

    public CharSequence getPageTitle(int position) {

        switch (position){
            case 0 :
                return "Tutti";
            case 1 :
                return "Preferiti";
        }
        return null;
    }

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


person Simone Varletta    schedule 07.09.2015    source источник
comment
вы можете проверить этот пример   -  person Cabezas    schedule 11.01.2017
comment
Спасибо за getChildFragmentManager(). Я заменил getFragmentManager() на него в своем проекте.   -  person CoolMind    schedule 01.04.2020


Ответы (2)


Я уверен, что это не единственный/лучший способ сделать это. Но это должно решить проблему, как это было со мной.

Пожалуйста, напишите методы refresh() как во фрагментах FragmentCanali, так и во фрагментах FragmentPreferiti.

    public class ListCanali extends Fragment implements OnPageChangeListener{
    private MyAdapter mAdapter;

    @Override
    public View OnCreateView (...) {
    ...
    if(mAdapter == null) {
    mAdapter = new MyAdapter(getChildFragmentManager());
    }
    viewPager.setAdapter(mAdapter);
    viewPager.setOnPageChangeListener(this);
    ...
    }

    ...
    @Override
    public void OnPageSelected (int position) {
    switch (position){
            case 0 : ((FragmentCanali)adapter.getItem(position)).refresh();
            case 1 : ((FragmentPreferiti)adapter.getItem(position)).refresh();
        }
    }}

Будет чище, если вы расширите оба фрагмента из базового фрагмента, который имеет абстрактный метод refresh().

В onPageSelected() вы можете просто вызвать ((BaseFragment)adapter.getItem(position)).refresh()

person Ramesh    schedule 07.09.2015

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

Чтобы обновить фрагмент, вам сначала нужен его экземпляр.

изменить это

 viewPager.setAdapter(new MyAdapter(getChildFragmentManager()));

to

 ArrayList<Fragment> fr_list = new ArrayList<Fragment>();
 fr_list.add(new FragmentCanali());
 fr_list.add(new FragmentPreferiti());
 MyAdapter mMyAdapter = new MyAdapter(getChildFragmentManager(),fr_list);
 viewPager.setAdapter(mMyAdapter);

В адаптере измените это

 public MyAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public Fragment getItem(int position)
{
    switch (position){
        case 0 : return new FragmentCanali();
        case 1 : return new FragmentPreferiti();
    }
    return null;
}

public int getCount() {

    return int_items;

}

to

 public MyAdapter(FragmentManager fm,ArrayList<Fragment> fr_list) {
    super(fm);
    this.fr_list=fr_list;
}

@Override
public Fragment getItem(int position)
{     
        return fr_list.get(position);
}

public int getCount() {

    return fr_list.size();

}

добавьте методы refresh() внутри фрагментов и вызывайте их всякий раз, когда вам нужно, как показано ниже

((FragmentCanali) mMyAdapter.fr_list.get(0)).refresh();
person uday    schedule 07.09.2015
comment
привет, спасибо, но покажите мне ошибку... экран: Нажмите ЗДЕСЬ - person Simone Varletta; 07.09.2015
comment
Хорошо, я решил, но у меня новая ошибка: НАЖМИТЕ ЗДЕСЬ - person Simone Varletta; 07.09.2015
comment
добавьте эту строку в свой адаптер ArrayList‹Fragment› fr_list; - person uday; 07.09.2015
comment
я уже добавил строку, посмотрите на экран. Что такое fr_list? Можешь отредактировать и вставить мой фрагмент в пример? - person Simone Varletta; 07.09.2015
comment
Измените ((FragmentCanali)fr_list.get(0)).refresh(); на ((FragmentCanali)mMyAdapter.fr_list.get(0)).refresh();, где mMyAdapter — ваша переменная-член для адаптера. - person lenooh; 16.11.2016