I am using MaterialtTabHost and ViewPager and i want that whenever i switch to new tab it should be updated with new data automatically.
This is my activity in which i have added the tabs and viewPager for every ViewPager i have a different Fragment to show.
public class FrontPage_Activity extends AppCompatActivity implements MaterialTabListener {
ViewPager mPager;
StorageUtil storageUtil;
User user;
MaterialTabHost tabHost;
Toolbar toolbar;
MyPageAdapter myPageAdapter;
@Override
protected void onResume() {
super.onResume();
for (int i = 0; i < myPageAdapter.getCount(); i++) {
tabHost.addTab(tabHost.newTab().setText(myPageAdapter.getPageTitle(i)).setTabListener(this));
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_front_page_);
storageUtil = new StorageUtil(this);
storageUtil.setUserStatus(1);
user = storageUtil.getUser();
toolbar = (Toolbar) findViewById(R.id.app_bar);
setSupportActionBar(toolbar);
ActionBar actionBar = getSupportActionBar();
if (user != null)
actionBar.setTitle("Welcome " + user.getName());
mPager = (ViewPager) findViewById(R.id.pager);
tabHost = (MaterialTabHost) findViewById(R.id.materialTabHost);
mPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
tabHost.setSelectedNavigationItem(position);
}
});
myPageAdapter = new MyPageAdapter(getSupportFragmentManager());
mPager.setAdapter(myPageAdapter);
/*for (int i = 0; i < myPageAdapter.getCount(); i++) {
tabHost.addTab(tabHost.newTab().setText(myPageAdapter.getPageTitle(i)).setTabListener(this));
}*/
mPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
if (position == 0) {
} else if (position == 1) {
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
@Override
public void onTabSelected(MaterialTab tab) {
mPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabReselected(MaterialTab tab) {
}
@Override
public void onTabUnselected(MaterialTab tab) {
}
class MyPageAdapter extends FragmentPagerAdapter {
String tabs[] = getResources().getStringArray(R.array.tabs);
public MyPageAdapter(FragmentManager fm) {
super(fm);
}
@Override
public CharSequence getPageTitle(int position) {
return tabs[position];
}
@Override
public Fragment getItem(int position) {
return setFragment(position);
}
@Override
public int getCount() {
return 3;
}
}
private Fragment setFragment(int number) {
if (number == 0) {
Chats chats = new Chats();
return chats;
} else if (number == 1) {
Request frag = new Request();
return frag;
} else {
Invite frag = new Invite();
return frag;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.chatting_activity, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.logout:
storageUtil.clear();
startActivity(new Intent(this, MainActivity.class));
break;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onBackPressed() {
super.onBackPressed();
moveTaskToBack(true);
}
}
First off, this could be a bit tough, one approach has people different result also, yet there are eventually some ways to put on test.
One approach I usually used is to override the getItemPosition.
In your custome adapter (MyPageAdapter
), override getItemPosition like so:
class MyPageAdapter extends FragmentPagerAdapter {
...
@Override
public int getItemPosition(Object object) {
if (object instanceof Chats ) {
((Chats )object).updateMyLogicOrView();
}
if (object instanceof Request) {
((Request)object).updateMyLogicOrView();
}
if (object instanceof Invite) {
((Invite)object).updateMyLogicOrView();
}
return super.getItemPosition(object);
}
..
}
Then on each fragment which belongs to its own tab, You create updateMyLogicOrView()
. In the method, you put down some operations you want that supposedly to generate new data / update data on the view. When you move to a tab, this updateMyLogicOrView() will always be invoked through the overriden method.
// put this method on each fragment class
public void updateMyLogicOrView(){
// do some logics here..
// like component.setText()
// or, adding some new elements to adapter..
}