Reputation: 79
i´m trying to refresh my fragment so i can get new information to the user. basicly i´m doing an app to make tournaments. i have 3 tabs on my app the first tab allows users to add people the second one allows user to create an tournament and the last one shows the scores to the user.
But i got one problem, when i delete an user from the first tab and i go to my second tab my content doesn´t update, and i really want it to update, i tought about creating a new fragment when it gets selected or trying to refresh it when it gets selected but i´m new to android and i don´t really know how to do it.
Any ideias?
here is my MainActivity Code:
public class MainActivity extends AppCompatActivity{
// Declaring Your View and Variables
Toolbar toolbar;
ViewPager viewPager;
ViewPagerAdapter adapter;
TabLayout tabLayout;
CharSequence Titles[]={"Participantes","Torneio","Classificação"};
int Numboftabs =3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toolbar = (Toolbar) findViewById(R.id.tool_bar);
viewPager = (ViewPager) findViewById(R.id.viewPager);
tabLayout = (TabLayout)findViewById(R.id.tabLayout);
// Creating The Toolbar and setting it as the Toolbar for the activity
setSupportActionBar(toolbar);
// Creating The ViewPagerAdapter and Passing Fragment Manager, Titles fot the Tabs and Number Of Tabs.
adapter = new ViewPagerAdapter(getSupportFragmentManager(),Titles,Numboftabs);
// Assigning ViewPager View and setting the adapter
viewPager.setAdapter(adapter);
tabLayout.setupWithViewPager(viewPager);
tabLayout.setSelectedTabIndicatorColor(getResources().getColor(R.color.colorTextIcons));
tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
//should i refresh my tab here?
// how do i do that ?
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
if (id == R.id.action_info) {
Toast.makeText(getApplicationContext(), "Contacto: [email protected]", Toast.LENGTH_LONG).show();
return true;
}
return super.onOptionsItemSelected(item);
}
}
here is my ViewPageAdapter code:
public class ViewPagerAdapter extends FragmentStatePagerAdapter {
CharSequence Titles[]; // This will Store the Titles of the Tabs which are Going to be passed when ViewPagerAdapter is created
int NumbOfTabs; // Store the number of tabs, this will also be passed when the ViewPagerAdapter is created
// Build a Constructor and assign the passed Values to appropriate values in the class
public ViewPagerAdapter(FragmentManager fm,CharSequence mTitles[], int mNumbOfTabsumb) {
super(fm);
this.Titles = mTitles;
this.NumbOfTabs = mNumbOfTabsumb;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
super.destroyItem(container, position, object);
FragmentManager manager = ((Fragment) object).getFragmentManager();
FragmentTransaction trans = manager.beginTransaction();
trans.remove((Fragment) object);
trans.commit();
}
//This method return the fragment for the every position in the View Pager
@Override
public Fragment getItem(int position) {
switch(position) {// if the position is 0 we are returning the First tab
case 0:
Tab1 tab1 = new Tab1();
return tab1;
case 1:
Tab2 tab2 = new Tab2();
return tab2;
case 2:
Tab3 tab3 = new Tab3();
return tab3;
default:
return null;
}
}
// This method return the titles for the Tabs in the Tab Strip
@Override
public CharSequence getPageTitle(int position) {
return Titles[position];
}
// This method return the Number of tabs for the tabs Strip
@Override
public int getCount() {
return NumbOfTabs;
}
}
Upvotes: 0
Views: 2864
Reputation: 761
i'm faced with this same issue, based on answers and some tests.
I got one third alternative ( quite similar to the second method ):
Instead, you call notifyDataSetChanged()
, ( this caused strange behaviour in my TabLayout ), create a listener of type ViewPager.OnPageChangeListener
, and call directly the fragment update method. See the code:
public interface Updateable {
public void update();
}
public class MyFragment extends Fragment implements Updateable {
...
public void update() {
// do your stuff on fragment became visible
}
}
In Activity Host:
mAdapter = new DashboardPagerAdapter(DashboardActivity.this,
getSupportFragmentManager(), mTabs);
mAdapter.configure(mViewPager);
mViewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener(){
@Override
public void onPageSelected(int position) {
if (mAdapter != null) {
Updateable fragment = (Updateable)mAdapter.getItem(position);
if (fragment != null) {
fragment. update();
}
}
}
});
In that way the fragment is not recreated, just run the update method. What for me was enough.
Upvotes: 2