2016-07-06 2 views
0

Я работаю над проектом, в котором я должен динамически добавлять вкладки и данные из json.Фрагмент Oncreateview() не вызывается, если мы не проверим вкладки

Ниже приведен код в деятельности, в которой я добавить вкладки

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 не вызывается, если я не провежу вкладки.

А также, когда я нажимаю назад и возвращаюсь к этому действию, данные этой вкладки, оставшиеся при нажатии назад, появляются на первой вкладке.

Любая помощь/руководство будет оценено по достоинству.

ответ

0

Я предлагаю вам посмотреть на метод ViewPager's setOffscreenPageLimit(int). Он определяет, сколько вкладок влево/вправо должно быть предварительно инициализировано перед их показом.

Что касается проблемы «назад». Вероятно, первый фрагмент «добавлен» к активности Backstack, а другие «заменены». Поэтому вызов onBackPressed из Activity просто возвращается в Backstack.

+0

setOffscreenPageLimit не имеет никакого отношения. Oncreateview никогда не упоминается для первого фрагмента –

Смежные вопросы