Updated Android ViewPager snippet

There are 2 tabs in my application (Android Design Support Library), this is a snippet with 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; } 

I want to update the application fragment on Swipe and click on the tab title, because this will not happen, I hope you can help me guys.

+5
source share
3 answers

I am sure this is not the only / best way to do this. But this should solve the problem, as with me.

Please write refresh () methods in both the Channel Fragment and the fragment fragments.

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

This will be cleaner if you expand both fragments from the base fragment, which has an abstract refresh () method.

In onPageSelected (), you can simply call ((BaseFragment)adapter.getItem(position)).refresh()

+5
source

Try it...

To update a fragment, you need an instance of it first.

change this value

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

In the adapter, change this value

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

add refresh () methods inside the fragments and call them when you need, for example below

 ((FragmentCanali) mMyAdapter.fr_list.get(0)).refresh(); 
+4
source

The accepted answer is not a good way, so it added a solution. after a long struggle to find a working solution.

Just report it to the adapter , it works amazingly,

Link Code

  void setAdapter(int position) { PagerAdapter pagerAdapter = new PagerAdapter(getSupportFragmentManager()); viewPager.setAdapter(pagerAdapter); // when notify then set manually current position. viewPager.setCurrentItem(position); pagerAdapter.notifyDataSetChanged(); } 

call this code when configuring the adapter and when you want to update the interface.

In your snippet, add the code below to update the interface

 ((YourActivityName) getContext()).setAdapter(selectedTabPosition); 

Use instanceof for the context of the cast.

This generic code only helps those who find a working solution with minimal code.

+3
source

All Articles