How to create dynamic tabs and add different functionality for each fragment in Android?

I knew how to create static tabs, work with volleyball to receive data in android and work in each fragment, but how to create dynamic tabs using JSON and store different data on each of the tabs . Like the first tab, "मुख्य समाचार" saves images and data that come from different web services. I know that you can create tabs as follows:

 public class TabActivity extends AppCompatActivity { private Toolbar toolbar; private TabLayout tabLayout; private ViewPager viewPager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_tab); toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); viewPager = (ViewPager) findViewById(R.id.container); setupViewPager(viewPager); tabLayout = (TabLayout) findViewById(R.id.tabs); tabLayout.setupWithViewPager(viewPager); } private void setupViewPager(ViewPager viewPager) { ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); adapter.addFrag(new OneFragment(), "ONE"); adapter.addFrag(new TwoFragment(), "TWO"); 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 addFrag(Fragment fragment, String title) { mFragmentList.add(fragment); mFragmentTitleList.add(title); } @Override public CharSequence getPageTitle(int position) { return mFragmentTitleList.get(position); } } } 

I want to save "cat_name" as the name of TABS. How can i do this? I am trying to do this, but could not fix it correctly, how to get the data and save it as a tab name and dynamically create fragments for each tab and work on each tab individually.

Here is my web service for getting the tab name.

 { "status": 200, "message": "Purchase order updated successfully", "data": { "page_title": "Home | Welcome", "menu": [ { "cat_id": "1", "cat_name": "मुख्य समाचार", "description": "" }, { "cat_id": "2", "cat_name": "राजनीती ", "description": "" } 

Edit

How can I work with each individual tab, as in this image: as in this image:

0
source share
1 answer

You can do it.

 public class TabActivity extends AppCompatActivity { private Toolbar toolbar; private TabLayout tabLayout; private ViewPager viewPager; // Fragment List private final List<Fragment> mFragmentList = new ArrayList<>(); // Title List private final List<String> mFragmentTitleList = new ArrayList<>(); private ViewPagerAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_tab); toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); viewPager = (ViewPager) findViewById(R.id.container); initTitle(); // edited , you can use multiple titles and one Fragment for (int i = 0; i < mFragmentTitleList.size(); i++) { mFragmentList.add(new OneFragment()); } setupViewPager(viewPager); tabLayout = (TabLayout) findViewById(R.id.tabs); tabLayout.setupWithViewPager(viewPager); // Tab ViewPager setting viewPager.setOffscreenPageLimit(mFragmentList.size()); tabLayout.setupWithViewPager(viewPager); tabLayout.setTabsFromPagerAdapter(adapter); } /** * load title data ,it muest below ViewPagerAdapter initialize */ private void initTitle() { String response = "{\n" + " \"status\": 200,\n" + " \"message\": \"Purchase order updated successfully\",\n" + " \"data\": {\n" + " \"page_title\": \"Home | Welcome\",\n" + " \"menu\": [\n" + " {\n" + " \"cat_id\": \"1\",\n" + " \"cat_name\": \"मुख्य समाचार\",\n" + " \"description\": \"\" \n" + " },\n" + " {\n" + " \"cat_id\": \"2\",\n" + " \"cat_name\": \"राजनीती \",\n" + " \"description\": \"\"\n" + " }"; try { JSONObject jsonObject = new JSONObject(response); int status = jsonObject.getInt("status"); if (status == 200) { JSONObject data = jsonObject.getJSONObject("data"); JSONArray menu = data.getJSONArray("menu"); for (int i = 0; i < menu.length(); i++) { String cat_name = menu.getJSONObject(i).getString("cat_name"); mFragmentTitleList.add(cat_name); } } else { for (int i = 0; i < mFragmentList.size(); i++) { mFragmentTitleList.add("no title"); } } } catch (JSONException e) { e.printStackTrace(); } } private void setupViewPager(ViewPager viewPager) { adapter = new ViewPagerAdapter(getSupportFragmentManager(), mFragmentList, mFragmentTitleList); viewPager.setAdapter(adapter); } /** * ViewPagerAdapter setting */ 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); } } } 

Hope to help you.

0
source

Source: https://habr.com/ru/post/1272626/


All Articles