Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用viewpager(android)创建动态选项卡?_Java_Android_Android Fragments_Tabs_Android Viewpager - Fatal编程技术网

Java 如何使用viewpager(android)创建动态选项卡?

Java 如何使用viewpager(android)创建动态选项卡?,java,android,android-fragments,tabs,android-viewpager,Java,Android,Android Fragments,Tabs,Android Viewpager,我想用viewpager动态创建选项卡,但我不知道怎么做。 我将从我的webservice API获得一个jsonstring,如下所示: {"status":0,"data":[{"category":"fruit","pic":"URL","Content":"apple"},{"category":"fruit","pic":"URL","Content":"banana"},{"category":"fruit","pic":"URL","Content":"papaya"},{"cat

我想用viewpager动态创建选项卡,但我不知道怎么做。 我将从我的webservice API获得一个jsonstring,如下所示:

{"status":0,"data":[{"category":"fruit","pic":"URL","Content":"apple"},{"category":"fruit","pic":"URL","Content":"banana"},{"category":"fruit","pic":"URL","Content":"papaya"},{"category":"drink","pic":"URL","Content":"milktea"},{"category":"drink","pic":"URL","Content":"blacktea"},{"category":"drink","pic":"URL","Content":"greentea"},{"category":"animal","pic":"URL","Content":"dog"},{"category":"animal","pic":"URL","Content":"cat"},{"category":"animal","pic":"URL","Content":"lion"}]}
我想用viewpager和viewpager集合片段创建标签表单类别(水果、饮料、动物)(片段只有listview,listview有图片和文本)

现在我的代码是静态的

我只是设置了三个标签和三个片段来完成这项工作

屏幕:

现在我的代码是:

Food.java

public class Food extends AppCompatActivity {
Toolbar toolbar;
TabLayout tabLayout;
ViewPager viewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_food);
    toolbar = (Toolbar) findViewById(R.id.toolbar);
    toolbar.setTitle("");
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setDisplayShowHomeEnabled(true);
    viewPager = (ViewPager) findViewById(R.id.viewpager);
    viewPager.setOffscreenPageLimit(3);
    setupViewPager(viewPager);
    tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(viewPager);
}

private void setupViewPager(ViewPager viewPager) {
    FoodViewPagerAdapter adapter = new FoodViewPagerAdapter(getSupportFragmentManager());
    adapter.addFragment(new Fragment_Food_one(), "FRUIT");
    adapter.addFragment(new Fragment_Food_two(), "DRINK");
    adapter.addFragment(new Fragment_Food_three(), "ANIMAL");
    viewPager.setAdapter(adapter);
}
activity_food.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="edu.shu.foodtest.Food">
<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/ThemeOverlay.AppCompat.Light">

    <android.support.v7.widget.Toolbar xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:background="#EEEEEE"
        android:theme="@style/ThemeOverlay.AppCompat.Light"
        app:popupTheme="@style/AppTheme.PopupOverlay">
        <TextView
            android:id="@+id/toolbar_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:singleLine="true"
            android:text="test"
            android:textColor="@color/red"
            android:textSize="18sp"
            android:textStyle="bold" />
    </android.support.v7.widget.Toolbar>

    <android.support.design.widget.TabLayout
        android:id="@+id/tabs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:tabMode="fixed"
        app:tabGravity="fill"
        android:background="#FFFFFF"/>
</android.support.design.widget.AppBarLayout>

<android.support.v4.view.ViewPager
    android:id="@+id/viewpager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#EEEEEE"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

FoodViewPagerAdapter.java:

public class FoodViewPagerAdapter extends FragmentPagerAdapter {
private final List<android.support.v4.app.Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();

public FoodViewPagerAdapter(FragmentManager manager) {
    super(manager);
}

@Override
public android.support.v4.app.Fragment getItem(int position) {
    return mFragmentList.get(position);
}

@Override
public int getCount() {
    return mFragmentList.size();
}

public void addFragment(android.support.v4.app.Fragment fragment, String title) {
    mFragmentList.add(fragment);
    mFragmentTitleList.add(title);
}

@Override
public CharSequence getPageTitle(int position) {
    return mFragmentTitleList.get(position);
}
公共类FoodViewPagerAdapter扩展了FragmentPagerAdapter{
私有最终列表MFFragmentList=new ArrayList();
私有最终列表MFFragmentTitleList=new ArrayList();
公共FoodViewPagerAdapter(碎片管理器){
高级经理;
}
@凌驾
public android.support.v4.app.Fragment getItem(int位置){
返回MFFragmentList.get(位置);
}
@凌驾
public int getCount(){
返回MFFragmentList.size();
}
public void addFragment(android.support.v4.app.Fragment片段,字符串标题){
添加(片段);
MFFragmentTitleList.add(标题);
}
@凌驾
公共字符序列getPageTitle(int位置){
返回MFFragmentTitleList.get(位置);
}
Fragment_Food_one.java:

public class Fragment_Food_one extends Fragment {
View view;
ListView mListView;
TextView BrandID;
String brandid;
ArrayList<Foodlistclass> arraylist = new ArrayList<Foodlistclass>();
private String result;
JSONObject response_object;
Context context;
String jsonstring="{\"status\":0,\"data\":[{\"category\":\"fruit\",\"pic\":\"http://XXX.XXX.XXX.XXX/XXX.jpg\",\"Content\":\"apple\"},{\"category\":\"fruit\",\"pic\":\"http://XXX.XXX.XXX.XXX/XXX.jpg\",\"Content\":\"banana\"},{\"category\":\"fruit\",\"pic\":\"http://XXX.XXX.XXX.XXX/XXX.jpg\",\"Content\":\"papaya\"},{\"category\":\"drink\",\"pic\":\"http://XXX.XXX.XXX.XXX/XXX.jpg\",\"Content\":\"milktea\"},{\"category\":\"drink\",\"pic\":\"http://XXX.XXX.XXX.XXX/XXX.jpg\",\"Content\":\"blacktea\"},{\"category\":\"drink\",\"pic\":\"http://XXX.XXX.XXX.XXX/XXX.jpg\",\"Content\":\"greentea\"},{\"category\":\"animal\",\"pic\":\"http://XXX.XXX.XXX.XXX/XXX.jpg\",\"Content\":\"dog\"},{\"category\":\"animal\",\"pic\":\"http://XXX.XXX.XXX.XXX/XXX.jpg\",\"Content\":\"cat\"},{\"category\":\"animal\",\"pic\":\"http://XXX.XXX.XXX.XXX/XXX.jpg\",\"Content\":\"lion\"}]}";

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


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    view = inflater.inflate(R.layout.fragment_food_one, container, false);

    context = getActivity().getApplicationContext();
    mListView = (ListView) view.findViewById(R.id.listviewitem);
    try {
        setlistview();
    } catch (JSONException e) {
        e.printStackTrace();
    }
    return view;
}

public void setlistview() throws JSONException {
    jsonstring = jsonstring.replace("\\", "");
    response_object = new JSONObject(jsonstring.substring(jsonstring.indexOf("{"), jsonstring.lastIndexOf("}") + 1));
    String status = response_object.getString("status");
    if (status.equals("0")) {
        JSONArray responseData = response_object.optJSONArray("data");
        for (int i = 0; i < responseData.length(); i++) {
            Map<String, Object> item = new HashMap<String, Object>();
            JSONObject jsonChildNode = responseData.getJSONObject(i);
            String category = jsonChildNode.optString("category");
            System.out.println(category);
            String Content = jsonChildNode.optString("Content");
            System.out.println(Content);
            String pic = jsonChildNode.optString("pic");
            System.out.println(pic);
            if (category.equals("fruit")) {
                arraylist.add(new Foodlistclass(
                        pic, Content, "a", "aW"
                ));
            }
            FoodlistAdapter adapter = new FoodlistAdapter(context, R.layout.food_listitem, arraylist);
            mListView.setAdapter(adapter);
        }
    }
}
public class Fragment\u Food\u one扩展了Fragment{
视图;
列表视图;
TextView-BrandID;
字符串布兰迪;
ArrayList ArrayList=新的ArrayList();
私有字符串结果;
JSONObject响应_对象;
语境;
字符串jsonstring=“{\'状态\':0,\'数据\':[{\'类别\':\'水果\',\'图片\':\”http://XXX.XXX.XXX.XXX/XXX.jpg\“,”内容“:”苹果“},“{”类别“:”水果“,”图片“:\”http://XXX.XXX.XXX.XXX/XXX.jpg\“,”内容“:”香蕉“},“{”类别“:”水果“,”图片“:\”http://XXX.XXX.XXX.XXX/XXX.jpg\“,”内容“:”木瓜“},“{”类别“:”饮料“,”图片“:\”http://XXX.XXX.XXX.XXX/XXX.jpg\“,”内容“:”牛奶茶“},“{”类别“:”饮料“,”图片“:\”http://XXX.XXX.XXX.XXX/XXX.jpg\“,”内容“:”黑茶“},“{”类别“:”饮料“,”图片“:\”http://XXX.XXX.XXX.XXX/XXX.jpg\“,”内容“:”绿茶“},“{”类别“:”动物“,”图片“:\”http://XXX.XXX.XXX.XXX/XXX.jpg\“,\”内容\“:\”狗\“},{\”类别\“:\”动物“,”图片“:\”http://XXX.XXX.XXX.XXX/XXX.jpg\“,”内容“:”猫“},“{”类别“:”动物“,”图片“:\”http://XXX.XXX.XXX.XXX/XXX.jpg\“,”内容“:\”狮子“}]}”;
公共食品{
//必需的空公共构造函数
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
//为该碎片膨胀布局
视图=充气机。充气(R.layout.fragment\u food\u one,容器,假);
context=getActivity().getApplicationContext();
mListView=(ListView)view.findViewById(R.id.listviewitem);
试一试{
setlistview();
}捕获(JSONException e){
e、 printStackTrace();
}
返回视图;
}
public void setlistview()引发JSONException{
jsonstring=jsonstring.replace(“\\”,”);
response_object=newjsonobject(jsonstring.substring(jsonstring.indexOf(“{”)、jsonstring.lastIndexOf(“}”)+1);
String status=response_object.getString(“status”);
如果(状态等于(“0”)){
JSONArray responseData=响应_object.optJSONArray(“数据”);
对于(int i=0;i
fragment_food_one.xml:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">

<!-- TODO: Update blank fragment layout -->
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/transparent"
    android:orientation="vertical">

    <ListView
        android:id="@+id/listviewitem"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/transparent"
        android:divider="@android:color/transparent"
        android:dividerHeight="10dp"
        android:scrollbars="none"></ListView>
</LinearLayout>

我想将其更改为动态,因为它将在将来添加更多类别,如果我使用动态选项卡,它将从jsonstring自动添加选项卡

我是最新的android开发者,很多事情我都不知道。我研究了很多数据,但我无法实现我想做的

希望有人能告诉我怎么做或给我一个样本来做这件事

谢谢大家,我想对我糟糕的英语说声抱歉,我希望你们能理解我上面的意思

谢谢,谢谢!!!

请参阅下面的代码

我使用Gson将Java对象转换为JSON表示,并将JSON字符串转换为等效的Java对象

compile 'com.google.code.gson:gson:2.8.1'
项目

public class Item {

    private String category;
    private String picture;
    private String content;

    public Item(JSONObject jsonObject) throws JSONException {
        category = jsonObject.getString("category");
        picture = jsonObject.getString("picture");
        content = jsonObject.getString("content");
    }

    public String getCategory() {
        return category;
    }

    public String getPicture() {
        return picture;
    }

    public String getContent() {
        return content;
    }
}
main活动

public class MainActivity extends AppCompatActivity {

    private Map<String, List<Item>> list = new ArrayMap<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        loadData();

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        toolbar.setTitle("Test");
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);

        CategoriesPagerAdapter categoriesPagerAdapter = new CategoriesPagerAdapter(getSupportFragmentManager(), list);
        ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
        viewPager.setAdapter(categoriesPagerAdapter);

        TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(viewPager);
    }

    private void loadData() {
        try {
            String jsonstring = "{\"status\":0,\"data\":[{\"category\":\"fruit\",\"picture\":\"http://XXX.XXX.XXX.XXX/XXX.jpg\",\"content\":\"apple\"},{\"category\":\"fruit\",\"picture\":\"http://XXX.XXX.XXX.XXX/XXX.jpg\",\"content\":\"banana\"},{\"category\":\"fruit\",\"picture\":\"http://XXX.XXX.XXX.XXX/XXX.jpg\",\"content\":\"papaya\"},{\"category\":\"drink\",\"picture\":\"http://XXX.XXX.XXX.XXX/XXX.jpg\",\"content\":\"milktea\"},{\"category\":\"drink\",\"picture\":\"http://XXX.XXX.XXX.XXX/XXX.jpg\",\"content\":\"blacktea\"},{\"category\":\"drink\",\"picture\":\"http://XXX.XXX.XXX.XXX/XXX.jpg\",\"content\":\"greentea\"},{\"category\":\"animal\",\"picture\":\"http://XXX.XXX.XXX.XXX/XXX.jpg\",\"content\":\"dog\"},{\"category\":\"animal\",\"picture\":\"http://XXX.XXX.XXX.XXX/XXX.jpg\",\"content\":\"cat\"},{\"category\":\"animal\",\"picture\":\"http://XXX.XXX.XXX.XXX/XXX.jpg\",\"content\":\"lion\"}]}";
            String data = new JSONObject(jsonstring).get("data").toString();
            JSONArray jsonArray = new JSONArray(data);
            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject jsonObject = jsonArray.getJSONObject(i);
                Item item = new Item(jsonObject);
                String category = item.getCategory();

                List<Item> itemList;
                if (list.containsKey(category)) {
                    itemList = list.get(category);
                    list.remove(category);
                } else {
                    itemList = new ArrayList<>();
                }
                itemList.add(item);
                list.put(category, itemList);

            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}
public类MainActivity扩展了AppCompatActivity{
私有映射列表=新数组映射();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
loadData();
Toolbar Toolbar=(Toolbar)findViewById(R.id.Toolbar);
工具栏。设置标题(“测试”);
设置支持操作栏(工具栏);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
CategoriesPagerAdapter CategoriesPagerAdapter=新的CategoriesPagerAdapter(getSupportFragmentManager(),列表);
ViewPager ViewPager=(ViewPager)findViewById(R.id.ViewPager);
viewPager.setAdapter(categoriesPageAdapter);
TabLayout TabLayout=(TabLayout)findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
}
私有void loadData(){
试一试{
字符串jsonstring=“{\”状态\”:0,\“d
public class MainFragment extends Fragment {

    public static final String KEY_ITEM_LIST = "key-item-list";
    private List<Item> itemList = new ArrayList<>();

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (getArguments() != null) {
            Gson gson = new Gson();
            Type type = new TypeToken<ArrayList<Item>>() {
            }.getType();
            String itemsJson = getArguments().getString(KEY_ITEM_LIST);
            itemList = gson.fromJson(itemsJson, type);
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_main, container, false);

        String test = "";
        for (Item item : itemList) {
            test += "" + item.getContent();
        }

        TextView textView = (TextView) view.findViewById(R.id.textView);
        textView.setText(test);

        return view;
    }

}
public class CategoriesPagerAdapter extends FragmentPagerAdapter {

    private List<String> categories = new ArrayList<>();
    private Map<String, List<Item>> list = new ArrayMap<>();
    private SparseArray<MainFragment> mRegisteredFragments = new SparseArray<>();

    public CategoriesPagerAdapter(FragmentManager manager, Map<String, List<Item>> list) {
        super(manager);
        this.list = list;
        for (String category : list.keySet()) {
            categories.add(category);
        }
    }

    @Override
    public Fragment getItem(int position) {
        return newInstance(list.get(categories.get(position)));
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        MainFragment mainFragment = (MainFragment) super.instantiateItem(container, position);
        mRegisteredFragments.put(position, mainFragment);
        return mainFragment;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        mRegisteredFragments.remove(position);
        super.destroyItem(container, position, object);
    }

    @Override
    public int getCount() {
        return categories.size();
    }


    @Override
    public CharSequence getPageTitle(int position) {
        return categories.get(position);
    }

    private MainFragment newInstance(List<Item> items) {
        Gson gson = new Gson();
        Type type = new TypeToken<ArrayList<Item>>() {}.getType();
        MainFragment mainFragment = new MainFragment();
        Bundle args = new Bundle();
        args.putString(MainFragment.KEY_ITEM_LIST, gson.toJson(items, type));
        mainFragment.setArguments(args);
        return mainFragment;
    }
}