如何为每个新生成的片段动态设置不同的内容(来自JSON结构)?
这是我的MainActivity代码,我通过Bundle将信息传递给Fragment:
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);
}
}
}
这是我的片段类:
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;
}
}
此刻,每片碎片都含有所有酒精饮料。我知道我可以将它设置为静态/通过调用JSON名称... /,它会更容易,但我希望我的应用程序可扩展和开源,这就是为什么我想要动态创建所有内容(根据传递的JSON文件:))。
所以,最后我应该有 标签/酒精饮料/含酒精饮料 标签/汤/汤 Tab / Salads /沙拉......
答案 0 :(得分:1)
以这种方式更改OneFragment
构造函数。
来自
public OneFragment() {
// Required empty public constructor
}
致
public OneFragment(Context context,ArrayList<String> contentList ) {
this.context = context;
this.contentList = contentList ;
}
更改OneFragment
onCreate()
以获取直接内容列表,例如沙拉列表,将在 setsetupViewPager()
中添加的汤列表,如下面的代码
@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;
}
将此方法添加到ViewPagerAdapter。
public void addFrag(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
并对ViewPagerAdapter
构造函数
来自
public ViewPagerAdapter(FragmentManager fm, List<Fragment> fragments, List<String> titleLists) {
super(fm);
this.mFragmentList = fragments;
this.mFragmentTitleList = titleLists;
}
要强>
public ViewPagerAdapter(FragmentManager fm) {
super(fm);
}
现在根据您的需要制作其他3个Fragment
。即。OneFragment
之类的.Salad,Soups等,并传递该数据,删除 for loop ,其中添加Bundle bundle = new Bundle();
和所有数据。直接在 setupViewPager()中添加。
像这样改变方法。
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);
}
希望这会有帮助。