2017-04-09 1 views
1

Je suis MainActivity et l'activité de trois fragments. dans MainActivity, il obtient des données à partir d'un appel de service REST. Je veux passer des données REST aux trois fragments. comment l'atteindre?Comment passer la liste des api de repos à l'activité de fragment dans Android

ici mon 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 Activité

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; 
    } 
} 

Dans cette ligne adaptateur = new CustomListAdapter (getActivity(), startersList); Je veux obtenir des données de la liste de MainActivity

+0

S'il vous plaît montrer le code que vous avez –

+2

La réponse courte est utiliser Parcelable et passer des arguments Bundle dans tous les fragments –

+1

j'ai mis mon code – jeeva

Répondre

1

Si vous pouvez faire de votre classe d'élément de menu mettre en œuvre Parcelable

How can I make my custom objects Parcelable?

Ensuite, il est tout simplement une question d'arguments de passage au fragment

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

Dans le fragment, vous utiliseriez

getArguments().getParcelableArrayList("list") 

Vous pouvez également passer la chaîne JSON dans les arguments et l'analyser dans le fragment.

Remarque: cependant, cela ne fonctionne que si vous déplacez la méthode d'installation viewpager dans onResponse. Sinon, vos fragments sont déjà créés avec des listes vides.

Ou vous pourriez mettre en œuvre cette logique ci-dessus ici dans l'adaptateur

@Override 
public Fragment getItem(int position) { 
    Fragment f = mFragmentList.get(position); 
    // TODO f.setArguments() 
    return f; 
}