0

I use View-pager to set tab. inside category tab when i click any category load data from internet and i hide all category and data load inside recycleview. but now when I click on category tab I want to visible before view. note please : I want to click same tab and every time it need refresh. please check the image for better understand. Please check my adopter class.

 viewPager = (CustomViewPager) findViewById(R.id.tabs_viewpager);
        // viewPager.setPagingEnabled(false);
        tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(viewPager);

        tabFragmentPagerAdapter = new TabFragmentPagerAdapter(getSupportFragmentManager(), MainActivity.this, viewPager);
        tabFragmentPagerAdapter.addFrag(new FeatureFragment(), "Feature");
        tabFragmentPagerAdapter.addFrag(new DiscoverFragment(), "Discover");
        tabFragmentPagerAdapter.addFrag(new TopFragment(), "Top");
        tabFragmentPagerAdapter.addFrag(new CategoryFragment(), "Category");
        // setupViewPager(viewPager);
        viewPager.setAdapter(tabFragmentPagerAdapter);

My Adopter class

public class TabFragmentPagerAdapter extends FragmentPagerAdapter {

    private final List<Fragment> mfragmentlist = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();
    FragmentManager fragmentManager;
    final int[] ICONS = new int[]{
            R.drawable.feature,
            R.drawable.discover,
            R.drawable.top,
            R.drawable.category};
    public Context context;

    public ViewPager viewPager;


    public TabFragmentPagerAdapter(FragmentManager fm, Context context, ViewPager viewPager) {
        super(fm);
        this.context = context;
        this.viewPager = viewPager;
        this.fragmentManager = fm;

    }

    public View getTabView(int position) {
        // Given you have a custom layout in `res/layout/custom_tab.xml` with a TextView and ImageView
        View v = LayoutInflater.from(context).inflate(R.layout.custom_tab, null);
        final TextView tv = (TextView) v.findViewById(R.id.textViewMainTabFrag);
        tv.setText(mFragmentTitleList.get(position));
        ImageView img = (ImageView) v.findViewById(R.id.imgView);
        img.setImageResource(ICONS[position]);

        return v;
    }

    public void SetOnSelectView(TabLayout tabLayout, int position) {
        TabLayout.Tab tab = tabLayout.getTabAt(position);
        View selected = tab.getCustomView();
        TextView iv_text = (TextView) selected.findViewById(R.id.textViewMainTabFrag);
        iv_text.setTextColor(context.getResources().getColor(R.color.apps_color));
    }

    public void SetUnSelectView(TabLayout tabLayout, int position) {
        TabLayout.Tab tab = tabLayout.getTabAt(position);
        View selected = tab.getCustomView();
        TextView iv_text = (TextView) selected.findViewById(R.id.textViewMainTabFrag);
        iv_text.setTextColor(context.getResources().getColor(R.color.black));
    }

    public void addFrag(Fragment fragment, String title) {
        mfragmentlist.add(fragment);
        mFragmentTitleList.add(title);
    }

    /*    @Override
        public Fragment getItem(int position) {
            return ItemFragment.newInstance();
        }*/
    @Override
    public Fragment getItem(int position) {
        return mfragmentlist.get(position);
    }

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

    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }
}

main activity OnTabSelectedListener here will be good option to reload activity. but how and how to visible my view

  @Override
        public void onTabUnselected(TabLayout.Tab tab) {
            int c = tab.getPosition();
            tabFragmentPagerAdapter.SetUnSelectView(tabLayout, c);
        }

enter image description here

Amit Vaghela
  • 22,772
  • 22
  • 86
  • 142
t.gakk
  • 77
  • 2
  • 10

2 Answers2

3

you can use setUserVisibleHint :

In your fragment:

@Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser){
         //do something  //Load or Refresh Data
        }
    }

OR

In your Activity:

viewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
    @Override
    public void onPageSelected(int position) {
        // do something  //Load or Refresh Data
    } 
});

check this solutions

Amit Vaghela
  • 22,772
  • 22
  • 86
  • 142
  • where have you stucked ? – Amit Vaghela Sep 25 '17 at 05:59
  • @t.gakk **setUserVisibleHint** will be called when tab is clicked and accordingly you can load datas. so write in your every fragment and try – Amit Vaghela Sep 25 '17 at 06:07
  • my tab already selected and I click on tab again then need to reload – t.gakk Sep 25 '17 at 06:09
  • yes, this method will definetly work in this case@t.gakk – Amit Vaghela Sep 25 '17 at 06:11
  • Yea it help little bit but exactly that i want not working. if i click any tab and then click another tab and again click before tab it working. but i want to click same tab and every time it need refresh. – t.gakk Sep 25 '17 at 06:27
  • can you tell me how you wanted in it. according to question this answer will work properly – Amit Vaghela Sep 25 '17 at 06:34
  • Ok sir may be i fail to understood you. Can you give me any solution? – t.gakk Sep 25 '17 at 06:43
  • **setUserVisibleHint** method will be called when tab is clicked in that particular fragment and when it is called you can load/reload/refresh data. so you need to write this method inside your fragment and in this method call your method from where you are getting you data to display @t.gakk – Amit Vaghela Sep 25 '17 at 06:47
  • Let us [continue this discussion in chat](http://chat.stackoverflow.com/rooms/155225/discussion-between-t-gakk-and-amit-vaghela). – t.gakk Sep 25 '17 at 06:51
  • i can not chat right now but you can tell me if you are stucked – Amit Vaghela Sep 25 '17 at 10:14
  • @Override public void onTabReselected(TabLayout.Tab tab) { ((CategoryFragment)tabFragmentPagerAdapter.getItem(3)).updateView(); } This solve my problem. though i can't refresh activity – t.gakk Sep 25 '17 at 10:17
2

Try this ...

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();
    }
}
Ankita
  • 1,129
  • 1
  • 8
  • 15