2

I'm having MainActivity and three fragment activity. in MainActivity it gets data from REST service call. I want to pass REST data to all three fragments. how to achieve it?

here my code

MainActivty

public class MainActivity extends AppCompatActivity {

private Toolbar toolbar;
private TabLayout tabLayout;
private ViewPager viewPager;
private CustomListAdapter adapter;
private static final String TAG = MainActivity.class.getSimpleName();



public List<MenuItem> mainList = new ArrayList<MenuItem>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

          JsonArrayRequest itemReq = new JsonArrayRequest(url,
            new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray response) {
                    Log.d(TAG, response.toString());
                    try {

                            JSONArray jsonArray = response.getJSONArray(0);
                            // Parsing json
                            for (int i = 0; i < jsonArray.length(); i++) {
                                try {
                                    JSONObject obj = jsonArray.getJSONObject(i);
                                    MenuItem menuItem = new MenuItem();
                                    menuItem.setName(obj.getString("name"));
                                    menuItem.setImage(obj.getString("image"));
                                    menuItem.setPrice(obj.getString("price"));
                                    menuItem.setDesc(obj.getString("desc"));

                                    mainList.add(menuItem);

                                } catch (JSONException e) {
                                    e.printStackTrace();
                                }

                            }

                    }catch (JSONException e){

                    }
                    // notifying list adapter about data changes
                    // so that it renders the list view with updated data
                    adapter.notifyDataSetChanged();
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            VolleyLog.d(TAG, "Error: " + error.getMessage());
             hidePDialog();

        }
    });

    toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    viewPager = (ViewPager) findViewById(R.id.viewpager);
    setupViewPager(viewPager);

    tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(viewPager);
}




private void setupViewPager(ViewPager viewPager) {
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
    adapter.addFragment(new First(), "FIRST");
    adapter.addFragment(new Second(), "SECOND");
    adapter.addFragment(new Third(), "THIRD");
    viewPager.setAdapter(adapter);
}

class ViewPagerAdapter extends FragmentPagerAdapter {
    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();

    public ViewPagerAdapter(FragmentManager manager) {
        super(manager);
    }

    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

    @Override
    public int getCount() {
        return mFragmentList.size();
    }

    public void addFragment(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }
}

}

Fragment Activity

public class First extends Fragment{
    private ProgressDialog pDialog;
    private GridView gridView;
    private CustomListAdapter adapter;
    public First() {

    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view =  inflater.inflate(R.layout.fragment_one, container, false);

        gridView = (GridView) view.findViewById(R.id.list);
        adapter = new CustomListAdapter(getActivity(), startersList);
        gridView.setAdapter(adapter);
        return view;
    }
}

In this line adapter = new CustomListAdapter(getActivity(), startersList); I want to get list data from MainActivity

jeeva
  • 396
  • 6
  • 22

1 Answers1

1

If you can make your menu item class implement Parcelable

How can I make my custom objects Parcelable?

Then it's simply a matter of passing arguments to the Fragment

Bundle args = new Bundle();
args.putParcelableArrayList("list", mainList) ;
Fragment first = new First();
first.setArguments(first);
adapter.addFragment(first, "FIRST");

Within the Fragment, you would use

 getArguments().getParcelableArrayList("list")

Alternatively, you could also pass the JSON string into the arguments and parse it within the Fragment.

Note: however, that this only works if you move the viewpager setup method within onResponse. Otherwise, your Fragments are already created with empty lists.

Or you could implement that above logic here in the adapter

@Override
public Fragment getItem(int position) {
    Fragment f = mFragmentList.get(position);
    // TODO  f.setArguments() 
   return f;
}
Community
  • 1
  • 1
OneCricketeer
  • 179,855
  • 19
  • 132
  • 245