Как создать динамические вкладки и добавить разную функциональность к каждому фрагменту в Android?

Я знал, как создавать статические вкладки, работать залпом для получения данных в android и работать с каждым фрагментом, но как создавать динамические вкладки с помощью JSON и хранить различные детали для каждого из tabs. Как и первая вкладка, храните "मुख्य समाचार" изображения и детали, поступающие из разных веб-служб. Что я знаю, так это создавать такие вкладки:

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

Я хочу сохранить "cat_name" как имя TABS. как я могу это сделать? Я пытаюсь, но не могу исправить это должным образом, как получить данные и сохранить как имя вкладки, а также динамически создавать фрагменты для каждой вкладки и работать с каждой вкладкой индивидуально.

Вот мой веб-сервис для получения имени вкладок.

{
    "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": ""
            }

Изменить

Как я могу работать с каждой отдельной вкладкой, как показано на этом изображении:  как на этом изображении:


person Community    schedule 02.08.2017    source источник
comment
Вы можете хранить данные в конкретном фрагменте, используя cat_id   -  person Piyush    schedule 02.08.2017
comment
как вы можете это объяснить.   -  person    schedule 02.08.2017
comment
После того, как вы получите ответ от сервера, заполните свой адаптер, который включает заголовок вкладок и только один фрагмент. Когда вы проводите пальцем по вкладке или щелкаете вкладку, просто проверьте ее с помощью идентификатора категории, если они соответствуют отображению данных этой категории во фрагменте.   -  person Piyush    schedule 02.08.2017


Ответы (1)


Вы можете это сделать.

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

Надеюсь помочь вам.

person KeLiuyue    schedule 02.08.2017
comment
Не нужно создавать несколько фрагментов для разных категорий. Будет обработан только один фрагмент. - person Piyush; 02.08.2017
comment
Вы можете повторно использовать фрагмент после его создания. Не нужно каждый раз получать из списка фрагментов - person Piyush; 02.08.2017
comment
Я видел, как вы создали в нем OneFragmeng и TwoFragment. - person KeLiuyue; 02.08.2017
comment
@Piyush Можешь проверить, я использую несколько заголовков и один фрагмент. - person KeLiuyue; 03.08.2017
comment
Спасибо, теперь работает. Я хочу спросить, как я могу работать с отдельными фрагментами с разным ответом веб-службы - person ; 03.08.2017
comment
Один фрагмент с разными идентификаторами категорий - самый простой способ - person Piyush; 03.08.2017