I have a SlidingPagerAdapter with 4 fragments. Each fragment needs to be updated with data from server.
I have used asynctask for this purpose.
The Problem :
We all know how ViewPager works. Is there as way where we can download data from server for each fragment only once.
FragmentPagerAdapter
public class FragmentAdapter extends FragmentStatePagerAdapter {
SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>();
private String[] tabs = { "Strikers", "MidFielders", "Defenders", "GoalKeepers"};
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return new Strikers();
case 1:
return new MidFielders();
case 2:
return new Defenders();
case 3:
// return new FragmentPage4();
return new GoalKeepers();
}
return null;
// return MyFragment.newInstance(...);
}
public FragmentAdapter(FragmentManager fm) {
super(fm);
}
@Override
public CharSequence getPageTitle(int position) {
return tabs[position];
}
@Override
public int getCount() {
// get item count - equal to number of tabs
return 4;
}
}
ViewPager
public class FirstTeamPlayers extends Activity {
private ViewPager mViewPager;
private SlidingTabLayout mSlidingTabLayout;
private FragmentAdapter mAdapter;
private ArrayList<Forwards> forwards;
private ArrayList<KMidFielders> midFielders;
private ArrayList<KDefenders> defenders;
private ArrayList<Keepers> goalkeepers;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_first_team_players);
mViewPager = (ViewPager) findViewById(R.id.viewpager);
mAdapter = new FragmentAdapter(getFragmentManager());
mViewPager.setAdapter(new FragmentAdapter(getFragmentManager()));
mSlidingTabLayout = (SlidingTabLayout) findViewById(R.id.sliding_tabs);
mSlidingTabLayout.setViewPager(mViewPager);
mViewPager.setOffscreenPageLimit(4);
}
@Override
protected void onPause() {
super.onPause();
//igetActionBar().getSelectedNavigationIndex());
}
public Fragment getActiveFragment(ViewPager container, int position) {
String name = makeFragmentName(container.getId(), position);
return getFragmentManager().findFragmentByTag(name);
}
private static String makeFragmentName(int viewId, int index) {
return "android:switcher:" + viewId + ":" + index;
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
}
}
Fragment
public class Strikers extends Fragment {
private TextView tv;
private ArrayList<Forwards> forwards;
private ProgressDialog pd;
private ListView lv;
private StrikersAdapter mAdapter;
private Context mContext;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.strikers_fragment,container,false);
setHasOptionsMenu(true);
pd = new ProgressDialog(getActivity());
pd.setMessage("Loading...");
pd.setCancelable(false);
mContext =getActivity();
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
lv = (ListView) getView().findViewById(R.id.listView1);
new GetTeamPlayers().execute();
}
public void onEventMainThread(ArrayList<Forwards> result)
{
Toast.makeText(getActivity(),""+result.get(0).getPlayer_name(), Toast.LENGTH_SHORT).show();
tv.setText(""+result.get(0).getPlayer_name());
}
private class GetTeamPlayers extends AsyncTask<Void,Void,ArrayList<Forwards>>//ArrayList<NewsRes>>
{
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
pd.show();
}
@Override
//ArrayList<NewsRes>
protected ArrayList<Forwards> doInBackground(Void... params) {
HttpClient httpClient = new DefaultHttpClient();
try {
HttpGet httpGet = new HttpGet("http://eastbengalfootballclub.com/ebfcapp/profile");
HttpResponse httpResponse = httpClient.execute(httpGet);
HttpEntity httpEntity = httpResponse.getEntity();
String response = EntityUtils.toString(httpEntity);
int statusCode = httpResponse.getStatusLine().getStatusCode();
if(statusCode == 200) {
response = response.replace("(", "");
response = response.replace(")", "");
Log.i(".................", "" + response);
Gson gson = new Gson();
TeamModel responseModel = gson.fromJson(response, TeamModel.class);
ResponseResults results = responseModel.getResults();
forwards = results.getStrikers();
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
httpClient.getConnectionManager().shutdown();
return forwards;
}
@Override
protected void onPostExecute(final ArrayList<Forwards> result) {//final ArrayList<NewsRes> result
// TODO Auto-generated method stub
super.onPostExecute(result);
if(result!=null) {
pd.dismiss();
mAdapter = new StrikersAdapter(mContext, result);
lv.setAdapter(mAdapter);
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
Intent intent = new Intent(mContext, StrikersDetails.class);
intent.putExtra("details", result.get(position).getDescription());
intent.putExtra("preferrredpostion", result.get(position).getPosition_name());
intent.putExtra("nationality", result.get(position).getNationality());
intent.putExtra("name", result.get(position).getPlayer_name());
intent.putExtra("pastclubs", result.get(position).getPast_clubs());
intent.putExtra("bigimage", result.get(position).getBig_image());
String url = "http://eastbengalfootballclub.com/ebfcapp/profile/permalink/"+result.get(position).getPermalink();
Log.i("url is","......................."+url);
intent.putExtra("url",url);
startActivity(intent);
}
});
}
}
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.result_menu, menu);
// get my MenuItem with placeholder submenu
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId()) {
case R.id.search:
MenuItem searchMenuItem = item;
searchMenuItem.expandActionView(); // Expand the search menu item in order to show by default the query
SearchManager searchManager = (SearchManager) getActivity().getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) searchMenuItem.getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(getActivity().getComponentName()));
searchView.onActionViewExpanded();
searchView.setQueryHint("Search Results");
searchMenuItem.setOnActionExpandListener(new OnActionExpandListener() {
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
// TODO Auto-generated method stub
mAdapter.setData();
mAdapter.notifyDataSetChanged();
return true;
}
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
// TODO Auto-generated method stub
return true;
}
});
SearchView.OnQueryTextListener textChangeListener = new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextChange(String newText) {
// this is your adapter that will be filtered
mAdapter.getFilter().filter(newText);
return true;
}
@Override
public boolean onQueryTextSubmit(String query) {
// this is your adapter that will be filtered
mAdapter.getFilter().filter(query);
mAdapter.notifyDataSetChanged();
return true;
}
};
searchView.setOnQueryTextListener(textChangeListener);
break;
}
return super.onOptionsItemSelected(item);
}
}
The other fragments are similar. I would like to load data from server once and pass the same to fragments as soon as user swipes and update the views there. Loading data from server has to be once.
Initially i thought of loading all data from server in the activity which holds view pager.
Thought of using
mViewpager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int i, float v, int i2) {
}
@Override
public void onPageSelected(int i) {
}
@Override
public void onPageScrollStateChanged(int i) {
}
});
I also found some links on stackoverflow which suggests use of interfaces in onPageSelected. Each fragment implements the interface.