android - 将 Json 加载到一个类并将它们发送到不同的类

标签 android json android-studio android-fragments

请耐心等待,新开发人员,我正在尝试在其 xml 具有 View 寻呼机 tablayout 的 Fragment 类中加载一个 json 文件。我的目标是在一个类中加载所有数据,然后在同一个类中解析后,通过 bundle 或其他方式将这些数据发送到不同的选项卡。我尝试了我的方法,如果有任何其他方法可以做到这一点,那么你可以在这里发布。深表赞赏。
你可以看一下代码。

nd_home_main_VP.java(在这里加载所有的json)

public class nd_home_main_VP extends Fragment {
private TabLayout tabLayout;
private ViewPager viewPager;

private Toolbar toolbar;
private View view=null;

private FrameLayout frameLayout2;
private static final String boom="http://api.androidhive.info/json/movies.json";

private Fragment fragment;

Bundle bundle=new Bundle();
String b;

Bundle bundle2=new Bundle();
String b2;

private FragmentManager fragmentManager=getFragmentManager();
private FragmentTransaction fragmentTransaction;

public nd_home_main_VP() {

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    view= inflater.inflate(R.layout.nd_menu, container, false);

    frameLayout2=(FrameLayout)view.findViewById(R.id.fl_id);

    viewPager = (ViewPager)view.findViewById(R.id.viewPager_home_id);
    setupViewPager(viewPager);
    tabLayout = (TabLayout)view.findViewById(R.id.tabLayout_1_home_id);

    if (tabLayout != null) {
        tabLayout.setupWithViewPager(viewPager);
    }

    JsonArrayRequest jsonArrayRequest=new JsonArrayRequest(Request.Method.GET, boom, new Response.Listener<JSONArray>() {
        @Override
        public void onResponse(JSONArray response_jsonArray) {
            Log.d("YES",response_jsonArray.toString());

            for(int i=0;i<response_jsonArray.length();i++){

                try {
                    JSONObject jsonObject=response_jsonArray.getJSONObject(i);

                    b=jsonObject.getString("rating");
                    bundle.putString("message", b);
                    Log.d("b",bundle.toString());

                    b2=jsonObject.getString("releaseYear");
                    bundle2.putString("message2",b);
                    Log.d("b2",bundle2.toString());

                } catch (JSONException e) {
                    e.printStackTrace();
                }


            }

        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError volleyError) {

        }
    });
    AppController.getInstance().addToRequestQueue(jsonArrayRequest);

    return view;
}
public void doTransaction(){
    fragmentTransaction=getFragmentManager().beginTransaction();
    fragmentTransaction.replace(R.id.fl_id,fragment);
    fragmentTransaction.commit();
}
private void setupViewPager(ViewPager viewPager) {
    ViewPagerAdapter adapter = new ViewPagerAdapter(getFragmentManager());
    adapter.addFragment(new OneFragment(), "ONE");
    adapter.addFragment(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) {
        switch (position){
            case 1:
                fragment=new OneFragment();
                fragment.setArguments(bundle);
                doTransaction();
                return fragment;
            case 2:

                fragment=new TwoFragment();
                fragment.setArguments(bundle2);
                doTransaction();
                return fragment;

            default:
        }
        return mFragmentList.get(position);
    }

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

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

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

在 xml 文件中,我得到了 FrameLayout、TabLayout 和一个 ViewPager

这是这里的错误java.lang.IllegalStateException:无法更改 fragment 的容器 IDOneFragment{32fbf30a id=0x7f0d007c android:switcher:2131558526:1}: was 2131558524 now 2131558526
我想知道解决此问题的最佳方法是什么,现在您可以检查错误。

最佳答案

我认为你应该删除

       switch (position){
            case 1:
                fragment=new OneFragment();
                fragment.setArguments(bundle);
                doTransaction();
                return fragment;
            case 2:

                fragment=new TwoFragment();
                fragment.setArguments(bundle2);
                doTransaction();
                return fragment;

            default:
        }

您在适配器外部创建了两个 fragment ,因此无需在 getItem 中重新创建它们打回来。确实,无需调用doTransaction因为 viewPagerAdapter会处理它。

关于android - 将 Json 加载到一个类并将它们发送到不同的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38549924/

相关文章:

android - 如何在 sysfs 的文件夹内创建文件夹

android - 为什么 Firefox Mobile(仅适用于 Android)尽管类别相同,但显示相同的字体大小不同?

json - 如何将 JSON 数组中的所有键大写?

java - 在按下按钮之前运行一个方法,例如 document.ready 函数

android - app :theme is now deprecated. 请改为使用 android:theme

java - Android Studio DatatypeFactoryImpl 未找到

android - Kotlin-在SharedPreferences上保留MutableList

java - JSON重复键,使用java(spring)验证

ruby-on-rails - 防止 ruby​​ on rails 3 解析 JSON post

android - (Android Studio 3.2 Beta) - 导航架构组件配置