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 丢失的数据取决于选项卡的数量_Java_Android_Android Fragments - Fatal编程技术网

Java 丢失的数据取决于选项卡的数量

Java 丢失的数据取决于选项卡的数量,java,android,android-fragments,Java,Android,Android Fragments,我想根据API中保留的项目数创建多个选项卡。我已经成功地创建了选项卡,并且可以很好地进行切换,但问题是,例如,假设我有3个选项卡。当它们都被创建时,第一个和第二个选项卡是空的,第三个选项卡有数据,当我刷回1时,我也看到了加载的数据,但在第二个选项卡上从来没有。当选项卡为2时,两个选项卡都不显示数据。这是我的密码: 活动 public class MenuActivity extends AppCompatActivity { private ViewPager tabsPager;

我想根据API中保留的项目数创建多个选项卡。我已经成功地创建了选项卡,并且可以很好地进行切换,但问题是,例如,假设我有3个选项卡。当它们都被创建时,第一个和第二个选项卡是空的,第三个选项卡有数据,当我刷回1时,我也看到了加载的数据,但在第二个选项卡上从来没有。当选项卡为2时,两个选项卡都不显示数据。这是我的密码:

活动

public class MenuActivity extends AppCompatActivity {


    private ViewPager tabsPager;
    private Toolbar toolbar;
    private ImageView toolbarImageView;
    private TextView subTitleView, titleView, priceCounterView, itemsCounterView;
    private RatingBar ratingBar;
    private TabLayout tabLayout;
    private LinearLayout cartButton;
    private AVLoadingIndicatorView avi;
    private MenuPagerAdapter tabsAdapter;
    public List<MenuType> menuTypes = new ArrayList<>();
    public List<MenuItem> menuItems = new ArrayList<>();
    private Restaurant restaurant;
    private Context context;
    private CollapsingToolbarLayout collapsingToolbarLayout;
    private AppBarLayout appBarLayout;
    private int i = -1;
    public List<Fragment> fragments = new ArrayList<>();
    private int cartCount = 0;
    private int priceCount = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_menu);
        context = this;

        tabsPager = (ViewPager) findViewById(R.id.tabs_pager);
        toolbar = (Toolbar) findViewById(R.id.toolbar);
        tabLayout = (TabLayout) findViewById(R.id.tab_layout);
        avi = (AVLoadingIndicatorView) findViewById(R.id.avi);
        titleView = (TextView) findViewById(R.id.titleView);
        subTitleView = (TextView) findViewById(R.id.subTitle);
        ratingBar = (RatingBar) findViewById(R.id.ratingBar);
        toolbarImageView = (ImageView) findViewById(R.id.restoIcon_toolbar);
        appBarLayout = (AppBarLayout) findViewById(R.id.app_bar);
        collapsingToolbarLayout = (CollapsingToolbarLayout) findViewById(R.id.toolbar_layout);
        priceCounterView = (TextView) findViewById(R.id.items_price_counter);
        itemsCounterView = (TextView) findViewById(R.id.items_counter);
        cartButton = (LinearLayout) findViewById(R.id.view_order_button);

        if (cartCount == 0 && priceCount == 0){
            cartButton.setVisibility(View.GONE);
        }


        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);

        tabsPager.setCurrentItem(0);

        restaurant = (Restaurant) getIntent().getSerializableExtra("restaurant");

        collapsingToolbarLayout.setExpandedTitleColor(getResources().getColor(R.color.totalTransparent));

        getSupportActionBar().setTitle(restaurant.getName());
        titleView.setText(restaurant.getName());
        subTitleView.setText(restaurant.getSlogan());
        ratingBar.setRating(Float.parseFloat(restaurant.getRating()));

        Picasso.with(context)
                .load(restaurant.getImageURL())
                .placeholder(R.drawable.restaurant_placeholder)
                .into(toolbarImageView);

        loadMenuTypes();

    }

    //LOAD MENU TYPES

    public void loadMenuTypes(){

        RequestQueue queue = Volley.newRequestQueue(this);
        String url = getResources().getString(R.string.api) + "get-menu-types";
        final StringRequest postRequest = new StringRequest(Request.Method.POST, url,
                new Response.Listener<String>()
                {
                    @Override
                    public void onResponse(String response) {
                        try {
                            JSONObject jsonObject = new JSONObject(response);
                            JSONArray array = jsonObject.getJSONArray("menu_types");

                            for (int i = 0; i < array.length(); i++){
                                JSONObject restoMainMenu = array.getJSONObject(i);

                                if (restoMainMenu.getBoolean("hasData")) {
                                    MenuType menuType = new MenuType();

                                    menuType.setMenuIcon(restoMainMenu.getString("icon"));
                                    menuType.setRestaurant(restaurant);
                                    menuType.setRmenu(restoMainMenu.getString("title"));
                                    menuType.setMenuId(restoMainMenu.getString("id"));

                                    menuTypes.add(menuType);
                                }
                            }


                        } catch (JSONException e) {
                            Toast.makeText(context, e.getMessage(), Toast.LENGTH_SHORT).show();
                        }

                        loadMenuItems();

                    }
                },
                new Response.ErrorListener()
                {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        menuTypes.clear();
                        menuItems.clear();
                        loadMenuTypes();
                    }
                }
        ) {
            @Override
            protected Map<String, String> getParams()
            {
                Map<String, String>  params = new HashMap<String, String>();
                params.put("UID", restaurant.getId());

                return params;
            }
        };
        queue.add(postRequest);
    }

    //LOAD MENUS

    public void loadAllMenu(final MenuType mMenuType){

        RequestQueue queue = Volley.newRequestQueue(this);
        String url = getResources().getString(R.string.api) + "get-all-menu";
        StringRequest postRequest = new StringRequest(Request.Method.POST, url,
                new Response.Listener<String>()
                {
                    @Override
                    public void onResponse(String response) {
                        try {
                            JSONObject jsonObject = new JSONObject(response);
                            JSONArray array = jsonObject.getJSONArray("detailed_menus");
                            List<MenuItem> menuItems1 = new ArrayList<>();
                            for (int i = 0; i< array.length(); i++){
                                JSONObject restoDetailMenu = array.getJSONObject(i);
                                MenuItem item = new MenuItem(
                                        restaurant.getId(),
                                        restoDetailMenu.getString("Name"),
                                        restoDetailMenu.getString("id"),
                                        restoDetailMenu.getString("Price"),
                                        restoDetailMenu.getString("Description"),
                                        restoDetailMenu.getString("AvailableIn"),
                                        restoDetailMenu.getString("Icon")

                                );


                                menuItems.add(item);
                                menuItems1.add(item);
                            }
                            mMenuType.setMenuItems(menuItems1);

                        }

                        catch (JSONException e) {
                            Toast.makeText(context, e.getMessage(), Toast.LENGTH_SHORT).show();

                        }
                    }
                },
                new Response.ErrorListener()
                {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        loadAllMenu(menuTypes.get(i));
                        Toast.makeText(context, error.getMessage(), Toast.LENGTH_SHORT).show();

                    }
                }
        ) {
            @Override
            protected Map<String, String> getParams()
            {
                Map<String, String>  params = new HashMap<String, String>();
                params.put("MenuTypeId", mMenuType.getMenuId());
                params.put("restId", mMenuType.getRestaurant().getId());


                return params;
            }
        };
        queue.add(postRequest);
    }

    //TRIGER ALL MENU LOADER
    public void loadMenuItems(){

        for (int j = 0; j < menuTypes.size(); j++) {
            i = j;
            loadAllMenu(menuTypes.get(j));
        }

        avi.setVisibility(View.GONE);
        setUpTabs();
    }

    public void setUpTabs(){
        for (int j = 0; j < menuTypes.size(); j++) {
            tabLayout.addTab(tabLayout.newTab().setText(menuTypes.get(j).getRmenu()));
            MenuFragment fragment = new MenuFragment();
            Bundle bundle = new Bundle();
            bundle.putSerializable("data", menuTypes.get(j));
            fragment.setArguments(bundle);
            fragments.add(MenuFragment.newInstance(menuTypes.get(j)));
        }

        tabsAdapter = new MenuPagerAdapter(getSupportFragmentManager(), menuTypes);
        tabsAdapter.notifyDataSetChanged();
        tabsPager.setAdapter(tabsAdapter);
        tabLayout.setupWithViewPager(tabsPager);

        tabsPager.setAdapter(tabsAdapter);




    }

    public void addedToCart(int price){
        priceCount = priceCount + price;
        cartCount = cartCount + 1;

        if (cartCount > 0 && priceCount > 0){
            if (cartCount == 1){
                itemsCounterView.setText( String.valueOf(cartCount) + " item");
            } else {
                itemsCounterView.setText( String.valueOf(cartCount) + " items");
            }
            priceCounterView.setText(String.valueOf(priceCount) + " RWF");

            cartButton.setVisibility(View.VISIBLE);
        } else {
            cartButton.setVisibility(View.GONE);
        }
    }

    @Override
    public boolean onSupportNavigateUp() {
        onBackPressed();
        return true;
    }
}
如图所示,我首先加载MenuTypes(列表),然后对于每个MenuTypes,我也加载所有关联项(MenuItems)列表。一、 然后,根据菜单类型的数量创建选项卡,然后根据列表中菜单项的数量创建菜单项的实例,对于每个菜单项的实例,我只为RecyclerView中的特定菜单项类型列出菜单项(工作正常)。我试图在MenuFragment中添加一个静态文本视图,它每次都显示在所有选项卡上,但我想要的实际数据没有显示。我还尝试了一个临时解决方案,手动设置我希望从OnPageChangeListener中的活动中创建的每个片段的数据,但在我第一次导航到任何其他选项卡之前,它不会直接在第一个选项卡上工作,这使我选择退出该策略。非常感谢您的帮助。还包括屏幕截图以供参考


答案是使用片段的newInstance()函数,并将最初需要的所有内容作为参数传递。

请在问题中直接附加所有信息(图像)。对不起,我不允许在问题中直接附加图像,这就是为什么这些图像被上载并作为外部链接列出。
public class MenuPagerAdapter extends FragmentStatePagerAdapter {

    private List<MenuType> menuTypes;

    public MenuPagerAdapter(FragmentManager fm, List<MenuType> menuTypes) {
        super(fm);
        this.menuTypes = menuTypes;
    }

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

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

    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {

        return menuTypes.get(position).getRmenu();
    }
}
public class MenuFragment extends Fragment {

    @BindView(R.id.menuRecyclerView) RecyclerView menuRecyclerView;
    @BindView(R.id.avi) AVLoadingIndicatorView avi;
    private MenuType menuType;
    private Bundle args;
    private MenuAdapter adapter;
    private Context context;
    private int position;

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

    public static MenuFragment newInstance(MenuType mMenuType){
        MenuFragment fragment = new MenuFragment();
        Bundle args = new Bundle();
        args.putSerializable("data", mMenuType);
        fragment.setArguments(args);
        return fragment;
    }


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

        View view = inflater.inflate(R.layout.fragment_menu, container, false);
        ButterKnife.bind(this, view);
        context = container.getContext();

        menuRecyclerView.setHasFixedSize(true);
        menuRecyclerView.setLayoutManager(new LinearLayoutManager(context));

        adapter = new MenuAdapter(menuType.getMenuItems(), context);
        menuRecyclerView.setAdapter(adapter);
        avi.setVisibility(View.GONE);

        setData();

        return view;
    }


    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
        args = getArguments();
        menuType = (MenuType) args.getSerializable("data");
    }

    public MenuType getMenuType() {
        return menuType;
    }

    public void setMenuType(MenuType menuType) {
        this.menuType = menuType;
    }


    public void setData(){
        adapter = new MenuAdapter(menuType.getMenuItems(), getActivity());
        menuRecyclerView.setAdapter(adapter);
        avi.setVisibility(View.GONE);
    }
}