Wie kann ich für jedes neu generierte Fragment dynamisch unterschiedlichen Inhalt (aus der JSON-Struktur) setzen?Dynamisch unterschiedlichen Inhalt (aus JSON) für jedes Tab-Fragment generieren
Das ist mein MainActivity Code, ich Informationen über Bundle mit dem Fragment bin vorbei:
public class MainActivity extends AppCompatActivity {
private Toolbar toolbar;
private TabLayout tabLayout;
private ViewPager viewPager;
private GridView gridView;
String myData = "";
public static String test;
//Fragment List
private final List<Fragment> mFragmentList = new ArrayList<>();
//Title, Soups, Alcohol, Salads Lists
public final List<String> mFragmentTitleList = new ArrayList<>();
public final List<String> soupsList = new ArrayList<>();
public final List<String> alcDrinksList = new ArrayList<>();
public final List<String> saladsList = new ArrayList<>();
public final List<String> randomList = new ArrayList<>();
private ViewPagerAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
viewPager = (ViewPager) findViewById(R.id.viewpager);
//gridView = (GridView) findViewById(R.id.gridView);
loaddata();
tabLayout = (TabLayout) findViewById(R.id.tabs);
}
//Loading the JSON data, which will be used to create dynamically content such as tabs and info for the Fragments
private void loaddata() {
RequestQueue queue = Volley.newRequestQueue(this);
String url =
"https://ipfs.io/ipfs/QmQ69ScwoqSsFAdGV4oUKNaDMzSDuY9zcdRoFYkHPUZM7E";
String line = "";
StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
myData = response;
JSONArray soupsArray = null;
JSONArray alcDrinksArray = null;
JSONArray saladsArray = null;
JSONArray randomArray = null;
//Log.d("response", myData);
JSONObject object = null;
try {
object = new JSONObject(myData);
} catch (JSONException e) {
e.printStackTrace();
}
JSONObject menuitems = null;
try {
menuitems = object.getJSONObject("menuitems");
} catch (JSONException e) {
e.printStackTrace();
}
try {
alcDrinksArray = menuitems.getJSONArray("Alcohol Drinks");
} catch (JSONException e) {
e.printStackTrace();
}
for(int i = 0; i < alcDrinksArray.length(); i++) {
try {
alcDrinksList.add(String.valueOf(alcDrinksArray.getJSONObject(i).get("name")));
Log.d("alcDrinksList", alcDrinksList.toString());
} catch (JSONException e) {
e.printStackTrace();
}
}
try {
soupsArray = menuitems.getJSONArray("Soups");
} catch (JSONException e) {
e.printStackTrace();
}
for(int i = 0; i < soupsArray.length(); i++) {
try {
soupsList.add(String.valueOf(soupsArray.getJSONObject(i).get("name")));
} catch (JSONException e) {
e.printStackTrace();
}
}
try {
saladsArray = menuitems.getJSONArray("Salads");
} catch (JSONException e) {
e.printStackTrace();
}
for(int i = 0; i < saladsArray.length(); i++) {
try {
saladsList.add(String.valueOf(saladsArray.getJSONObject(i).get("name")));
} catch (JSONException e) {
e.printStackTrace();
}
}
for (int i = 0; i < menuitems.length(); i++) {
try {
mFragmentTitleList.add(menuitems.names().getString(i));
Bundle bundle = new Bundle();
//here I should pass dynamically created ArrayList<String> with data (e.g. different alcohol drinks, soups, salads, etc...) for the Fragment...
bundle.putStringArrayList("data", (ArrayList<String>) alcDrinksList);
Log.d("bundletest", alcDrinksList.toString());
mFragmentList.add(new OneFragment());
mFragmentList.get(i).setArguments(bundle);
//mFragmentTitleList gives output [Alcohol Drinks, Soups, Salads]
Log.d("test", String.valueOf(mFragmentTitleList));
} catch (JSONException e) {
e.printStackTrace();
}
//Log.d(TAG, "Key = " + menuitems.names().getString(i) + " value = " + menuitems.get(menuitems.names().getString(i)));
}
setupViewPager(viewPager);
//setupGridView(gridView);
tabLayout.setupWithViewPager(viewPager);
// Tab ViewPager setting
viewPager.setOffscreenPageLimit(mFragmentList.size());
tabLayout.setupWithViewPager(viewPager);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Context context = getApplicationContext();
int duration = Toast.LENGTH_SHORT;
Toast.makeText(context, "That didn't work!", duration);
}
});
queue.add(stringRequest);
}
private void setupViewPager(ViewPager viewPager) {
adapter = new ViewPagerAdapter(getSupportFragmentManager(), mFragmentList, mFragmentTitleList);
viewPager.setAdapter(adapter);
}
/*private void setupGridView(GridView gridView) {
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, alcDrinksList);
gridView = (GridView) findViewById(R.id.gridView);
gridView.setAdapter(adapter);
}*/
//ViewPagerAdapter settings
class ViewPagerAdapter extends FragmentPagerAdapter {
private List<Fragment> mFragmentList = new ArrayList<>();
private List<String> mFragmentTitleList = new ArrayList<>();
public ViewPagerAdapter(FragmentManager fm, List<Fragment> fragments, List<String> titleLists) {
super(fm);
this.mFragmentList = fragments;
this.mFragmentTitleList = titleLists;
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList == null ? 0 : mFragmentList.size();
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitleList.get(position);
}
}
}
Das ist mein Fragment Klasse:
public class OneFragment extends Fragment {
private List<String> contentList = new ArrayList<>();
ArrayAdapter<String> adapter;
GridView gridView;
public OneFragment() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout for this fragment
contentList = getArguments().getStringArrayList("data");
Log.d("contentList", contentList.toString());
View view = inflater.inflate(R.layout.fragment_one, null);
gridView = (GridView) view.findViewById(R.id.gridView);
adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, contentList);
gridView.setAdapter(adapter);
return view;
}
}
Im Moment habe ich die Alkohol alle Getränke haben auf jedes Fragment. Ich weiß, dass ich es statisch einstellen kann/durch den Aufruf der JSON-Namen ... /, es wäre viel einfacher, aber ich möchte, dass meine App skalierbar und Open Source ist, deshalb möchte ich alles dynamisch erstellen (laut JSON-Datei übergeben :)).
am Ende So sollte ich Tab/Alkoholische Getränke/mit den alkoholischen Getränken Tab/Suppen haben/mit den Suppen Tab/Salate/mit den Salaten ...
Diese Listen sind nur um sicher zu sein, dass mein Code funktioniert. Theoretisch brauche ich vielleicht eine neue Liste (in der for-Schleife) jedes Mal, wenn ich die Registerkarte erstelle. Ich meine, wenn Sie z.B. {"Suppen": [{"name": "Blumenkohl-Creme", ...}, {"Name": "Lachs", ...}]. Wenn also ein neuer Reiter z.B.Suppen wird erstellt, es sollte nur die Information binden, die über die Suppen ist, dann könnte ich .get ("name") rufen und den Namen der Suppe erhalten, um ihn auf dem Fragment anzuzeigen ... –