【问题标题】:How to create dynamic tabs and add different functionality to each fragment in Android?如何在 Android 中创建动态选项卡并为每个片段添加不同的功能?
【发布时间】:2023-04-02 06:55:01
【问题描述】:

我知道如何创建静态选项卡,使用 volley 在 android 中获取数据并在每个片段中工作,但是如何使用 JSON 创建动态选项卡并在每个 tabs 上存储不同的详细信息。就像第一个标签存储 "मुख्य समाचार" 来自不同 Web 服务的图像和详细信息。 我所知道的是创建这样的标签:

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

编辑

我如何处理每个单独的选项卡,如下图所示:

【问题讨论】:

  • 您可以使用cat_id将数据存储在特定片段中
  • 你怎么解释呢。
  • 在您从服务器获得响应后,填写您的适配器,其中包括选项卡标题并且只膨胀一个片段。当您滑动选项卡或单击选项卡时,只需使用类别 id 进行检查,如果它们匹配,则在片段中显示该类别数据。

标签: android android-fragments tabs android-tablayout


【解决方案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);
    }
}
}

希望能帮到你。

【讨论】:

  • 不需要为不同的类别创建多个片段。只会处理一个片段。
  • 创建实例后可以重用片段。无需每次都从片段列表中获取
  • 我看到你在其中创建了OneFragmengTwoFragment
  • @Piyush 你可以查一下。我用了多个title和一个Fragment。
  • 谢谢,现在可以使用了。我想问如何处理具有不同 Web 服务响应的单个片段
猜你喜欢
  • 2018-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-27
  • 1970-01-01
  • 2021-08-23
  • 2013-11-15
  • 1970-01-01
相关资源
最近更新 更多