首页 > 解决方案 > 如何从 Web 服务将 ViewPager 中的片段添加到 TabLayout?

问题描述

我正在尝试TabLayout-ViewPager-Fragment动态地将选项卡添加到我的基于应用程序中。TabLayout使用一个自定义视图,ImageView顶部有一个TextView.

我现在想要的是根据JSONObjectsJSONArray从 PHP/MySQL Web 服务创建的数量添加选项卡。我尝试了下面的方法,PagerAdapter但它抛出:

java.lang.IllegalStateException: Can't change tag of fragment TstFrag{df80bc8 #0 id=0x7f080157 android:switcher:2131231063:0}: was android:switcher:2131231063:0 now android:switcher:2131231063:1.

该方法如下面的我的适配器中

public class FrgAdapter extends FragmentStatePagerAdapter {
private List<Fragment> mFragmentList = new ArrayList<>();
private List<String> mFragmentTitleList = new ArrayList<>();

public FrgAdapter(FragmentManager fm) {
    super(fm);
}

public FrgAdapter(FragmentManager fm, List<Fragment> mFragmentList, List<String> mFragmentTitleList) {
    super(fm);
    this.mFragmentList = mFragmentList;
    this.mFragmentTitleList = mFragmentTitleList;

}

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

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

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

public void insertFromJSONObject(JSONObject jsonObject, Fragment fragment, CircularImageView imageView, TextView textView) throws JSONException {
    JSONArray dataArray = jsonObject.getJSONArray("data");

    for (int i = 0; i < dataArray.length(); i++) {
        JSONObject sectionObj = (JSONObject) dataArray.get(i);

        JSONArray sectionsArray = sectionObj.getJSONArray("section");

        for (int j = 0; j < sectionsArray.length(); j++) {
            JSONObject obj = (JSONObject) sectionsArray.get(j);
            Picasso.get().load(obj.getString("imag")).into(imageView);
            mFragmentList.add(fragment);
            mFragmentTitleList.add(obj.getString("name"));
            textView.setText(obj.getString("name"));
            notifyDataSetChanged();
        }
    }
}

@Override
public CharSequence getPageTitle(int position) {
    return null;
}}

这是在我的活动中调用该方法以添加片段的位置:

private void setUpViewPager(ViewPager viewPager, View view) {
    adapter = new FrgAdapter(getSupportFragmentManager());
    /*adapter.addFragment(new MleFrag(), "Men");
    adapter.addFragment(new FmlFrag(), "Women");
    adapter.addFragment(new ChdFrag(), "Children");
    adapter.addFragment(new AceFrag(), "Accessories");
    */
    String url = "https://44091ee6.ngrok.io/Glam/men.json";
    AndroidNetworking.get(url)
            .setPriority(Priority.MEDIUM)
            .build()
            .getAsJSONObject(new JSONObjectRequestListener() {
                @Override
                public void onResponse(JSONObject response) {
                    try {
                        adapter.insertFromJSONObject(response, new TstFrag(), view.findViewById(R.id.circularImageView), view.findViewById(R.id.text_header));
                        adapter.notifyDataSetChanged();
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }

                @Override
                public void onError(ANError anError) {
                    Toast.makeText(getApplicationContext(), anError.toString(), Toast.LENGTH_LONG).show();
                }
            });
    adapter.notifyDataSetChanged();
    viewPager.setAdapter(adapter);
}

这是我的Fragment。在我看来,我想在Fragment每次需要时重复使用这个。

public class TstFrag extends Fragment {

public TstFrag() {

}

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

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    return inflater.inflate(R.layout.layout_cht, container, false);
}}

标签: androidandroid-fragmentsandroid-viewpagerandroid-tablayout

解决方案


你可以试试这个:

adapter.insertFromJSONObject(response, view.findViewById(R.id.circularImageView), view.findViewById(R.id.text_header));
adapter.notifyDataSetChanged();

public void insertFromJSONObject(JSONObject jsonObject, CircularImageView imageView, TextView textView) throws JSONException {
    JSONArray dataArray = jsonObject.getJSONArray("data");

    for (int i = 0; i < dataArray.length(); i++) {
        JSONObject sectionObj = (JSONObject) dataArray.get(i);

        JSONArray sectionsArray = sectionObj.getJSONArray("section");

        for (int j = 0; j < sectionsArray.length(); j++) {
            JSONObject obj = (JSONObject) sectionsArray.get(j);

            Picasso.get().load(obj.getString("imag")).into(imageView);
            mFragmentList.add(new TstFrag());
            textView.setText(obj.getString("name"));
            //mFragmentTitleList.add(obj.getString("name"));
            notifyDataSetChanged();
        }
    }
}

这里的基本思想是TstFragFrgAdapter.


推荐阅读