I've created activity from TabbedActivity
template (in Android Studio):
This template uses Fragment
and FragmentPagerAdapter
to handle tabs.
This is code of two classes, PlaceholderFragment extends Fragment
, and SectionsPagerAdapter extends FragmentPagerAdapter
:
public static class PlaceholderFragment extends Fragment {
/**
* The fragment argument representing the section number for this
* fragment.
*/
private static final String ARG_SECTION_NUMBER = "section_number";
public PlaceholderFragment() {
}
/**
* Returns a new instance of this fragment for the given section
* number.
*/
public static PlaceholderFragment newInstance(int sectionNumber) {
PlaceholderFragment fragment = new PlaceholderFragment();
Bundle args = new Bundle();
args.putInt(ARG_SECTION_NUMBER, sectionNumber);
fragment.setArguments(args);
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_list_view, container, false);
int scnum = getArguments().getInt(ARG_SECTION_NUMBER);
final ListView listView = (ListView) rootView.findViewById(R.id.products_list);
// here refresh my listView trough internet
return rootView;
}
}
/**
* A {@link FragmentPagerAdapter} that returns a fragment corresponding to
* one of the sections/tabs/pages.
*/
public class SectionsPagerAdapter extends FragmentPagerAdapter {
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
// getItem is called to instantiate the fragment for the given page.
// Return a PlaceholderFragment (defined as a static inner class below).
return PlaceholderFragment.newInstance(position + 1);
}
@Override
public int getCount() {
// Show 3 total pages.
return 3;
}
}
In onCreateView
method I refresh my ListView
. This method is called when i switch tabs.
But I need to refresh ListView
not when user switch tabs, but:
1. every 10 seconds
2. when user comes back to this activity (onRestart()
method is called)
I have no idea how to access my ListView
outside onCreateView
method.
I've already tried many solutions from the internet to call onCreateView
method from onRestart
method, and just to access my ListView
from onRestart()
. None of them worked.
Globally in Activity class I have an instance of SectionsPagerAdapter
and ViewPager
:
private SectionsPagerAdapter mSectionsPagerAdapter;
private ViewPager mViewPager;
They are initalized in onCreate
by this way:
mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
// Set up the ViewPager with the sections adapter.
mViewPager = (ViewPager) findViewById(R.id.container);
mViewPager.setAdapter(mSectionsPagerAdapter);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
tabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(mViewPager));
I think, there are 2 possible solutions, access my Fragment's view or just recall onCreateView
.
I've already tried to do:
This one just doesn't work:
@Override protected void onRestart() { super.onRestart(); mSectionsPagerAdapter.notifyDataSetChanged(); }
This one crashes app because of NullPointerException:
@Override protected void onRestart() { super.onRestart(); Fragment f = mSectionsPagerAdapter.getItem(0); // tab with my list view is first tab. ( getItem(1) also does not work ) View v = f.getView(); // v is null here, however f isn't. final ListView listView = v.findViewById(R.id.products_list); // v is null, NullPointerException is thrown. // here refresh my listView trough internet }
EDIT:
Since I started using Kotlin, answer based on that language will be also accepted. However, I am new to Kotlin, so more detailed answer would be needed then.