I am using different instance of the same fragment in a viewPager.Because every page does the same thing but only differ by data.But the problem is viewPager shows same data in all pages.Creating new instance in the adapter does not change the data.All what i want is when the user swipes to new page it shows a new instance of the same fragment as shown in the adapter respective to the position.
Here is the adapter :
public class FragmentPageAdapter extends FragmentPagerAdapter {
public FragmentPageAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
if (position == 0) {
ListViewFragment f = ListViewFragment.newInstance("https://newsapi.org/v1/articles?source=al-jazeera-english&sortBy=top&apiKey=6cde");
return f;
}
else if (position == 1){
return ListViewFragment.newInstance("https://newsapi.org/v1/articles?source=abc-news-au&sortBy=top&apiKey=6cde");
}
else
{
return ListViewFragment.newInstance("https://newsapi.org/v1/articles?source=bbc-news&sortBy=top&apiKey=6cde");
}
}
@Override
public int getCount() {
return 3;
}
}
And this activity holds the viewPager:
public class WorldNews extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_world_news);
// Find the view pager that will allow the user to swipe between fragments
ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
// Create an adapter that knows which fragment should be shown on each page
FragmentPageAdapter adapter = new FragmentPageAdapter(getSupportFragmentManager());
// Set the adapter onto the view pager
viewPager.setAdapter(adapter);
}
}
Here is the code for the Fragment(Just a normal fragment which implements loader):
public class ListViewFragment extends Fragment implements LoaderManager.LoaderCallbacks<List<GameNews>> {
public static ListViewFragment newInstance(String url) {
Log.d("ListViewFragment","newInstance created");
ListViewFragment f = new ListViewFragment();
// Supply url input as an argument.
Bundle args = new Bundle();
args.putString("url", url);
f.setArguments(args);
return f;
}
private AdView mAdView;
AdRequest adRequest;
ListAdapter adapter ;
private View progressBar;
final private int game_loader = 0;
ArrayList<String> urls = new ArrayList<>();
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.activity_list_view, container, false);
//Log.d("ListViewFragment","" + getArguments().getString("url"));
mAdView = (AdView) rootView.findViewById(R.id.adView);
adRequest = new AdRequest.Builder().build();
mAdView.loadAd(adRequest);
final LinearLayout emptyView = (LinearLayout) rootView.findViewById(R.id.no_internet_view);
emptyView.setVisibility(View.INVISIBLE);
//Getting listView
final ListView gameListView = (ListView) rootView.findViewById(R.id.listView);
//progress bar finding
progressBar = rootView.findViewById(R.id.progress_bar);
ArrayList<GameNews> gameList = new ArrayList<>();
Button retryButton = (Button) rootView.findViewById(R.id.retry_button);
//Making a new arrayAdapter
adapter = new ListAdapter(getActivity(),gameList);
//Connecting ArrayAdapter to ListView
gameListView.setAdapter(adapter);
urls.add(getArguments().getString("url"));
Log.d("ListViewFragment","" + urls.get(0));
if(isConnected())
{
getActivity().getLoaderManager().initLoader(game_loader, null, this);
}
else
{
emptyView.setVisibility(View.VISIBLE);
gameListView.setVisibility(View.INVISIBLE);
}
//ListView item click listner
gameListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
GameNews currentEarthquake = adapter.getItem(i);
String url = currentEarthquake.getUrl();
final Intent intent = new Intent(getContext(), browser.class);
intent.putExtra("Url", url);
startActivity(intent);
}
});
retryButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(isConnected())
{
mAdView.loadAd(adRequest);
getActivity().getLoaderManager().restartLoader(game_loader, null, ListViewFragment.this);
emptyView.setVisibility(View.INVISIBLE);
gameListView.setVisibility(View.VISIBLE);
progressBar.setVisibility(View.VISIBLE);
Log.d("General news","retry clicked");
}
}
});
return rootView;
}
public boolean isConnected() {
ConnectivityManager manager = (ConnectivityManager)getActivity().getSystemService(CONNECTIVITY_SERVICE);
NetworkInfo info = manager.getActiveNetworkInfo();
if (info != null && info.isConnected()) {
return true;
} else {
return false;
}
}
@Override
public Loader<List<GameNews>> onCreateLoader(int i, Bundle bundle) {
AdManager manager = new AdManager(getActivity());
return new GameLoader(getActivity(),urls,1000);
}
@Override
public void onLoadFinished(Loader<List<GameNews>> loader, List<GameNews> games) {
progressBar.setVisibility(View.INVISIBLE);
adapter.clear();
if(games == null)
{
return;
}
adapter.addAll(games);
}
@Override
public void onLoaderReset(Loader<List<GameNews>> loader) {
adapter.clear();
}
public void setUrl(String url)
{
this.urls.add(url);
}
}