web-dev-qa-db-fra.com

Comment actualiser un fragment d'un FragmentPagerAdapter?

J'ai 2 onglets appelés tab1 (home) et tab2 (profile) utilisant les bibliothèques TabPageIndicator et FragmentPagerAdapter.

Dans l'onglet 2, j'ai un bouton intitulé "Connexion" (l'onglet 2 gonfle abc.xml).

Lorsque les utilisateurs cliquent sur le bouton "Connexion", l'application affiche un formulaire de connexion dans une nouvelle activité . Après la connexion, l'activité se termine et la vue du contenu de tab2 change (le profil de l'utilisateur est affiché car il gonfle xyz.xml). . Comment puis je faire ça?

public class MainActivity extends SherlockFragmentActivity {
    private static String[] TAB_NAMES = null;
    private Context context = this;
    private static FragmentPagerAdapter adapter ;
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        if (TAB_NAMES == null) {
            TAB_NAMES = new String[] {
                    getResources().getString(R.string.tab_home),
                    getResources().getString(R.string.tab_profile) };
        }
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        adapter = new TabsAdapter(
                getSupportFragmentManager());

        ViewPager pager = (ViewPager) findViewById(R.id.pager);

        pager.setAdapter(adapter);


        TabPageIndicator indicator = (TabPageIndicator) findViewById(R.id.indicator);
        indicator.setViewPager(pager);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater infalter = getSupportMenuInflater();
        infalter.inflate(R.menu.main_menu, menu);
        return true;
    }

    class TabsAdapter extends FragmentPagerAdapter {
        public TabsAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            switch (position) {
            case 0:
                return HomeFragment.getInstance();
            case 1:
                return new ProfileFragment();

            default:
                return HomeFragment.getInstance();
            }
        }
        }
13
EastBK

Vous pouvez utiliser FragmentStatePagerAdapter au lieu de FragmentPagerAdapter 

Vous pouvez essayer comme ça:

private static FragmentStatePagerAdapter adapter ;
private static String[] TAB_NAMES = null;

@Override
protected void onCreate(Bundle savedInstanceState) {

    if (TAB_NAMES == null) {
        TAB_NAMES = new String[] {
                getResources().getString(R.string.tab_home),
                getResources().getString(R.string.tab_profile) };
    }
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    adapter = new FragmentStatePagerAdapter(getSupportFragmentManager()) {
        @Override
        public Fragment getItem(int position) {
            switch (position) {
                case 0:
                    return HomeFragment.getInstance();
                case 1:
                    return new ProfileFragment();

                default:
                    return HomeFragment.getInstance();
            }
        }

        @Override
        public int getCount() {
            return TAB_NAMES.length;
        }

        @Override
        public int getItemPosition(Object fragItem) {
            int position = 0;
            if (fragItem instanceof HomeFragment) {
                position = 0;
            } else if (fragItem instanceof  ProfileFragment) {
                position = 1;
            }
            return (position >= 0) ? position : POSITION_NONE;
        }
    }

    ViewPager pager = (ViewPager) findViewById(R.id.pager);
    pager.setAdapter(adapter);


    TabPageIndicator indicator = (TabPageIndicator) findViewById(R.id.indicator);
    indicator.setViewPager(pager);

}

Référence

Vous pouvez vérifier ceci solution.

3
missionMan

Vous pouvez utiliser startActivityForResult (ou broadcast/receiver) pour obtenir le résultat de l'activité. Utilisez ensuite adapter.notifyDataSetChanged pour actualiser le fragment.

A propos de l'actualisation de ViewPager, plus en détail:

ViewPager PagerAdapter ne met pas à jour la vue

1
Loki

Je faisais également face au même problème, je l'ai donc résolu en route:

Actualisez simplement votre HomeFragment ou ProfileFragment en remplaçant la méthode onResume.

Dans la méthode onResume, vous pouvez facilement actualiser votre ListFragment ou votre fragment.

0
Min2

J'ai essayé beaucoup de solutions trouvées dans google et stackoverflow à propos de ce problème. Tous ne fonctionnaient pas correctement. De plus, les didacticiels des pages de développeur Google Android officielles ne fonctionnaient pas. 

J'ai implémenté ViewPageIndicator dans mon application et j'ai essayé de créer un imageslider. J'ai des URL dynamiques pour les images qui proviennent du succès du rappel de service. Donc, je dois définir mon adaptateur viewpager et indicateur dans OnResume. Quand j'ai réglé tout était ok, je charge des fragments dans onResume et, après OnStop, je les recharge. Mais lorsque j'envoie une application en arrière-plan et que j'ouvre d'autres applications que j'ai réalisées après onResume, mon curseur ne peut pas recharger les images. 

Après avoir perdu mon temps, j'ai essayé de comprendre le style de vie des fragments que j'avais créés dans fragmentpageradapter getItem clairement avec les événements de journalisation et de débogage onCreateView et onResume. 

Si vous créez vos fragments comme 

Fragment myFragment = new Fragment(url,position);

Lorsque vous arrêtez votre activité et ouvrez d'autres applications, vous perdez les vars que vous définissez sur le constructeur de votre fragment personnalisé. Quand j'ai réalisé cette situation, j'ai essayé l'approche groupée.

Voici mon FragmentPagerAdapter personnalisé (j'ai utilisé l'exemple de Google)

public class ScreenSlidePageAdapter extends FragmentPagerAdapter implements IconPagerAdapter {

        ArrayList<String> urls;

        public ScreenSlidePageAdapter(ArrayList<String>urls,FragmentManager fm) {
            super(fm);
            this.urls = urls;
            fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
        }

        @Override
        public Fragment getItem(int position) {
            SliderFragment sliderFragment = new SliderFragment();
            Bundle bundle = new Bundle();
            bundle.putString("url",urls.get(position));
            sliderFragment.setArguments(bundle);
            return sliderFragment;
        }

    @Override
    public int getIconResId(int index) {
        return R.drawable.notification_circle;
    }

    @Override
    public int getCount() {
        return this.urls.size();
    }

} 

Mon FragmentPagerAdapter personnalisé implémente IconPagerAdapter. Attention à ça. 

Et mon SliderFragment personnalisé:

public class SliderFragment extends Fragment {

    private String url;
    private int position;
    private boolean clickable;

    public SliderFragment() {
    }

    public SliderFragment(String url, int position, boolean clickable) {

        this.url = url;
        //this.position = position;
        //this.clickable = clickable;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

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


            this.url = getArguments().getString("url");

            ImageView imageView = (ImageView) rootView.findViewById(R.id.iv_image);
            com.nostra13.universalimageloader.core.ImageLoader.getInstance().displayImage(Constants.URL_PREFIX + url, imageView);


                imageView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Intent intent = new Intent(getActivity(),SliderActivity.class);
                        intent.putExtra("url",url);
                        startActivity(intent);
                        getActivity().overridePendingTransition(R.anim.anim_slide_in_left,
                                R.anim.anim_slide_out_left);
                    }
                });


        return rootView;
    }

Et enfin ma méthode loadSlider qui charge les éléments du curseur

private void loadSlider() {

        pager = (ViewPager) findViewById(R.id.dealdetailpager);

        ScreenSlidePageAdapter screenSlidePageAdapter = new ScreenSlidePageAdapter(dealDetail.getImages(),getSupportFragmentManager());
        pager.setAdapter(screenSlidePageAdapter);

        circlePageIndicator = (CirclePageIndicator) findViewById(R.id.indicator);
        circlePageIndicator.setViewPager(pager);

        sliderThread = new SliderThread(true, 0);
        sliderThread.start();
    }

Je ne pouvais pas avoir la chance de vérifier si mes fragments de curseur étaient mis à jour, mais au moins des fragments vivent après OnStop et c'est ce dont j'avais le plus besoin.

0
savepopulation