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