2017-12-14 3 views
1

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 ...

Antwort

0

Änderung Ihrer OneFragment Konstruktor dieser Weg.

von dieser

public OneFragment() { 
// Required empty public constructor 
} 

Um

public OneFragment(Context context,ArrayList<String> contentList) { 
    this.context = context; 
    this.contentList = contentList ; 
} 

Änderung OneFragmentonCreate() für direkten contentList holen wie Salat Liste, Suppe Liste, die in setsetupViewPager() wie unten Code hinzugefügt werden

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    //contentList will get data from constructor 
    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; 
} 

Fügen Sie diese Methode zu Ihrem ViewPagerAdapter hinzu.

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

und Änderung

von diesem

public ViewPagerAdapter(FragmentManager fm, List<Fragment> fragments, List<String> titleLists) { 
    super(fm); 
    this.mFragmentList = fragments; 
    this.mFragmentTitleList = titleLists; 
} 

Um

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

Jetzt für ViewPagerAdapter Konstruktor machen machen andere 3 erforderlich Fragment nach Ihrem Bedarf. d.Salad, Suppen usw. wie OneFragment und übergeben Sie diese Daten, entfernen Sie für Schleife, wo Sie Bundle bundle = new Bundle(); und alle Daten hinzufügen. direkt hinzufügen wie folgt in setupViewPager(). ändern Methode wie folgt.

private void setupViewPager(ViewPager viewPager) { 
    adapter = new ViewPagerAdapter(getSupportFragmentManager()); 

    adapter.addFrag(new OneFragment(context,alcDrinksList)); 
    adapter.addFrag(new SaladFragment(context,saladsArray)); 
    adapter.addFrag(new SoupFragment(context,soupsArray)); 
    viewPager.setAdapter(adapter); 
} 

Hope this helfen.

+0

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 ... –

Verwandte Themen