0

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.

1 Answers1

1

there are many ways to get the result you want...one of them is to have the main activity responsable for the data, other is to store data into a singleton class..

I elaborate further with an example of having the Main Activity providing data to the fragments:

For example in Main Activity we have a class holding name and surname :

public static class MyData{

    String mName;
    String mSurname;

    public MyData(String mName, String mSurname) {
        this.mName = mName;
        this.mSurname = mSurname;
    }


    public String getmName() {
        return mName;
    }


    public String getmSurname() {
        return mSurname;
    }

}

Also in the Main Activity we have a public static Array holding data items :

public static ArrayList<MyData>mData = new ArrayList<>();

In the OnCreate Main Activity we populate the data :

mData.add(new MyData("John","Doe"));
mData.add(new MyData("Peter","Pan"));

From the fragments we can access data like so :

    ArrayList<MainActivity.MyData>list = MainActivity.mData;

    for(MainActivity.MyData obj : list){
        Log.d("DATA", obj.getmName() + " " + obj.getmSurname());

    }
J.Vassallo
  • 2,282
  • 3
  • 15
  • 14