How to Update Fragment ViewPager
My approach to update fragments within the viewpager is to use the setTag()
method for any instantiated view in the instantiateItem()
method. So when you want to change the data or invalidate the view that you need, you can call the findViewWithTag()
method on the ViewPager
to retrieve the previously instantiated view and modify/use it as you want without having to delete/create a new view each time you want to update some value.
Imagine for example that you have 100 pages with 100 TextView
s and you only want to update one value periodically. With the approaches explained before, this means you are removing and instantiating 100 TextView
s on each update. It does not make sense…
You can see complete code here
In my adapter
import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.view.ViewGroup; import com.thedeveloperworldisyours.effectiveviewpager.fragments.FirstFragment; import com.thedeveloperworldisyours.effectiveviewpager.fragments.SecondFragment; import com.thedeveloperworldisyours.effectiveviewpager.fragments.ThirdFragment; import java.util.HashMap; import java.util.Map; /** * Created by javiergonzalezcabezas on 17/1/16. */ public class MyPagerAdapter extends FragmentPagerAdapter { private static int NUM_ITEMS = 3; private Map<Integer, String> mFragmentTags; private FragmentManager mFragmentManager; public MyPagerAdapter(FragmentManager fragmentManager) { super(fragmentManager); mFragmentManager = fragmentManager; mFragmentTags = new HashMap<Integer, String>(); } // Returns total number of pages @Override public int getCount() { return NUM_ITEMS; } // Returns the fragment to display for that page @Override public Fragment getItem(int position) { switch (position) { case 0: return FirstFragment.newInstance(); case 1: return SecondFragment.newInstance(); case 2: return ThirdFragment.newInstance(); default: return null; } } // Returns the page title for the top indicator @Override public CharSequence getPageTitle(int position) { return "Page " + position; } @Override public Object instantiateItem(ViewGroup container, int position) { Object object = super.instantiateItem(container, position); if (object instanceof Fragment) { Fragment fragment = (Fragment) object; String tag = fragment.getTag(); mFragmentTags.put(position, tag); } return object; } public Fragment getFragment(int position) { Fragment fragment = null; String tag = mFragmentTags.get(position); if (tag != null) { fragment = mFragmentManager.findFragmentByTag(tag); } return fragment; } }
And now in my activity:
import android.support.v4.app.Fragment; import android.support.v4.view.ViewPager; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import com.thedeveloperworldisyours.effectiveviewpager.adapters.MyPagerAdapter; public class MainActivity extends AppCompatActivity implements ViewPager.OnPageChangeListener{ MyPagerAdapter mAdapterViewPager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ViewPager viewPager = (ViewPager) findViewById(R.id.vpPager); mAdapterViewPager = new MyPagerAdapter(getSupportFragmentManager()); viewPager.setAdapter(mAdapterViewPager); viewPager.addOnPageChangeListener(this); } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { Fragment fragment = mAdapterViewPager.getFragment(position); if (fragment != null) { fragment.onResume(); } } @Override public void onPageScrollStateChanged(int state) { } }
Finally in your Fragment, something like that:
public class YourFragment extends Fragment { // newInstance constructor for creating fragment with arguments public static YourFragment newInstance() { return new YourFragment(); } // Store instance variables based on arguments passed @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } // Inflate the view for the fragment based on layout XML @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment, container, false); } @Override public void onResume() { super.onResume(); //to refresh your view refresh(); } }
You can see complete code here
The post Update Fragment ViewPager appeared first on The Developer World Is Yours.
This post first appeared on The Developer World Is Yours. Android, Magento & E, please read the originial post: here