除非我们滑动选项卡,否则不会调用片段Oncreateview()

时间:2016-07-06 16:28:27

标签: android android-fragments tabs

我正在开发一个项目,我必须从json中动态添加标签和数据。

以下是我添加标签

的活动中的代码
private void getShopDetails() {
    coordinatorLayout.setVisibility(View.GONE);
    new ProgressDialog(this);
    ProgressDialog.show();

    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(shopDetailsJsonUrl, new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {

            SharedPreferences sharedPreferences = getSharedPreferences("ShopDetailsJson", MODE_PRIVATE);
            SharedPreferences.Editor editor = sharedPreferences.edit();
            editor.putString("sdresponse", response.toString());
            editor.apply();
            ProgressDialog.dismiss();
            coordinatorLayout.setVisibility(View.VISIBLE);

            try {
                JSONArray shopDetailsArray = response.getJSONArray("shop_details");
                JSONObject shopDetailsObj = shopDetailsArray.getJSONObject(0);
                shopName = shopDetailsObj.getString("shop_name");

                phone = shopDetailsObj.getString("tel");
                shopNum = shopDetailsObj.getString("shop_no");
                shopAddress = shopDetailsObj.getString("shop_address");
                shopImage = shopDetailsObj.getString("featured_image");
                Glide.with(getApplicationContext()).load("http://allmartapp.com/appapi/uploads/" + shopImage).diskCacheStrategy(DiskCacheStrategy.SOURCE).into(backdrop);
                colLayout.setTitle(shopName);
                address.setText("Address - " + shopAddress);
                JSONArray tabsArray = response.getJSONArray("category");
                if (tabsArray != null) {
                    categoryId = new int[tabsArray.length()];
                    for (int i = 0; i < tabsArray.length(); i++) {
                        JSONObject tabsObj = tabsArray.getJSONObject(i);
                        tabLayout.addTab(tabLayout.newTab().setText(tabsObj.getString("category_name")));
                        categoryId[i] = tabsObj.getInt("category_id");

                    }
                    tabLayout.setTabGravity(TabLayout.GRAVITY_CENTER);
                    PagerAdapter pagerAdapter = new PagerAdapter(getSupportFragmentManager(), tabLayout.getTabCount());
                    pager.setAdapter(pagerAdapter);
                    pager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
                    pager.setOffscreenPageLimit(tabLayout.getTabCount());
                    tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
                        @Override
                        public void onTabSelected(TabLayout.Tab tab) {
                            pager.setCurrentItem(tab.getPosition());
                            ShopDetailsTabsFragment.sgetid(categoryId[tab.getPosition()]);
                            Log.d("CATIID", categoryId[tab.getPosition()] + "");
                            pager.setCurrentItem(tab.getPosition());


                        }

                        @Override
                        public void onTabUnselected(TabLayout.Tab tab) {

                        }


                        @Override
                        public void onTabReselected(TabLayout.Tab tab) {


                        }
                    });


                }


            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            error.printStackTrace();
            ProgressDialog.dismissWithError();
        }
    });

    int socketTimeout = 30000;//30 seconds - change to what you want
    RetryPolicy policy = new DefaultRetryPolicy(socketTimeout, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
    jsonObjectRequest.setRetryPolicy(policy);
    AppController.getInstance().addToRequestQueue(jsonObjectRequest);
}

以下是片段

的代码
public class ShopDetailsTabsFragment extends Fragment {
RecyclerView recyclerView;
boolean isViewShown = true;
CategoryListItemsAdapter shopListRvAdapters;

private String shopDetailsJsonUrl = "http://allmartapp.com/appapi/json/get_shop_details_by_shop_id/";

private String baseshopDetailsJsonUrl = "http://allmartapp.com/appapi/json/get_shop_details_by_shop_id/";

ArrayList<CategoryItemsListModel> arrayList = new ArrayList<>();
static int catid = 0;
int shopId;
Boolean isdataloaded = false;
ProgressBar progressBar;


private boolean fragmentResume = false;
private boolean fragmentVisible = true;
private boolean fragmentOnCreated = false;

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


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View v = inflater.inflate(R.layout.fragment_shop_details_tabs, container, false);
    recyclerView = (RecyclerView) v.findViewById(R.id.rv);
    recyclerView.setLayoutManager(new GridLayoutManager(getActivity(), 2));

    progressBar = (ProgressBar) v.findViewById(R.id.progressBarTabs);


    SharedPreferences sharedPreferences = getActivity().getSharedPreferences("SHOPID", Context.MODE_PRIVATE);
    shopId = sharedPreferences.getInt("shopid", 0);


    if (!fragmentResume && fragmentVisible) {   //only when first time fragment is created
        makeJsonRequest();
    }

    shopListRvAdapters = new CategoryListItemsAdapter(arrayList, getActivity());
    recyclerView.setAdapter(shopListRvAdapters);


    return v;

}


@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);

    if (isVisibleToUser && isResumed()) {   // only at fragment screen is resumed
        fragmentResume = true;
        fragmentVisible = false;
        fragmentOnCreated = true;
        makeJsonRequest();
    } else if (isVisibleToUser) {        // only at fragment onCreated
        fragmentResume = false;
        fragmentVisible = true;
        fragmentOnCreated = true;
    } else if (!isVisibleToUser && fragmentOnCreated) {// only when you go out of fragment screen
        fragmentVisible = false;
        fragmentResume = false;
    }


//        if (getView() != null) {
//            isViewShown = true;
//            makeJsonRequest();
//
//
//            // fetchdata() contains logic to show data when page is selected         mostly asynctask to fill the data
//        } else {
//            isViewShown = false;
//        }
}

public static void sgetid(int cat) {
    catid = cat;
}


private void getShopCat() {
    recyclerView.setAdapter(null);
    shopDetailsJsonUrl += shopId;
    arrayList.clear();
    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(shopDetailsJsonUrl, new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            isdataloaded = true;
            Log.d("JSON", response.toString());

            try {
                JSONArray categoryArray = response.getJSONArray("category");

                if (arrayList != null) {
                    if (arrayList.size() > 0)
                        arrayList.clear();
                }

                for (int i = 0; i < categoryArray.length(); i++) {
                    JSONObject catObj = categoryArray.getJSONObject(i);

                    int category_id = catObj.getInt("category_id");

                    if (category_id == catid) {

                        JSONArray productArray = catObj.getJSONArray("product");

                        for (int j = 0; j < productArray.length(); j++) {
                            JSONObject productObj = productArray.getJSONObject(j);

                            String name = productObj.getString("product_name");
                            String image = "http://allmartapp.com/appapi/uploads/" + productObj.getString("image_name");
                            int id = productObj.getInt("product_id");
                            int price = productObj.getInt("price");

                            arrayList.add(new CategoryItemsListModel(id, image, name, price));

                        }
                        shopListRvAdapters = new CategoryListItemsAdapter(arrayList, getActivity());
                        recyclerView.setAdapter(shopListRvAdapters);
                        shopListRvAdapters.notifyDataSetChanged();

                    }

                }


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


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

        }
    });

    int socketTimeout = 30000;//30 seconds - change to what you want
    RetryPolicy policy = new DefaultRetryPolicy(socketTimeout, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
    jsonObjectRequest.setRetryPolicy(policy);
    AppController.getInstance().addToRequestQueue(jsonObjectRequest);
    shopDetailsJsonUrl = baseshopDetailsJsonUrl;


}


void makeJsonRequest() {
    SharedPreferences sharedPreferences = getActivity().getSharedPreferences("ShopDetailsJson", Context.MODE_PRIVATE);
    String response = sharedPreferences.getString("sdresponse", null);

    try {
        JSONArray jsonArray = new JSONObject(response).getJSONArray("category");

        Log.d("TBASARRAY", jsonArray + "");

        progressBar.setVisibility(View.GONE);
        if (arrayList != null) {
            if (arrayList.size() > 0)
                arrayList.clear();
        }
        for (int i = 0; i < jsonArray.length(); i++) {

            JSONObject catObj = jsonArray.getJSONObject(i);
            int category_id = catObj.getInt("category_id");

            if (category_id == catid) {

                JSONArray productArray = catObj.getJSONArray("product");

                for (int j = 0; j < productArray.length(); j++) {
                    JSONObject productObj = productArray.getJSONObject(j);

                    String name = productObj.getString("product_name");
                    String image = "http://allmartapp.com/appapi/uploads/" + productObj.getString("image_name");
                    int id = productObj.getInt("product_id");
                    int price = productObj.getInt("price");

                    arrayList.add(new CategoryItemsListModel(id, image, name, price));

                }
                shopListRvAdapters = new CategoryListItemsAdapter(arrayList, getActivity());
                recyclerView.setAdapter(shopListRvAdapters);
                shopListRvAdapters.notifyDataSetChanged();

            }

        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
    recyclerView.addOnItemTouchListener(new CategoryListActivity.RecyclerTouchListener(getActivity(), recyclerView, new CategoryListActivity.OnClickListener() {
        @Override
        public void onClick(View v, int position) {

            int id = arrayList.get(position).getId();
            SharedPreferences sharedPreferences = getActivity().getSharedPreferences("CATITEMID", Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = sharedPreferences.edit();
            editor.putInt("catitemid", id);
            editor.apply();

            startActivity(new Intent(getActivity(), ItemDetailView.class));


        }

        @Override
        public void onLongClick(View v, int position) {

        }
    }));

//        shopDetailsJsonUrl = baseshopDetailsJsonUrl;


}

我的问题是只在我滑动选项卡时调用函数makeJsonRequest()。实际上,除非我滑动标签,否则不会调用onCreateview方法。

此外,当我按下并返回该活动时,按下时留下的该选项卡的数据将显示在第一个选项卡中。

任何帮助/指导都将不胜感激。

1 个答案:

答案 0 :(得分:0)

我建议您查看ViewPager's setOffscreenPageLimit(int)方法。 它控制在显示之前必须预先初始化/删除多少个选项卡。

至于“后退”问题。可能第一个片段被“添加”到活动Backstack,而其他片段被“替换”。因此,调用onBackPressed的{​​{1}}只会回到Backstack中。