2016-06-21 89 views
0

我是在android中使用我的項目中的片段新。第一次我的片段正在創建然後api調用並獲取數據加載到片段中。在這裏,當我點擊任何項目,我用另一個片段替換片段還有另一個API調用並加載數據到片段。 現在這裏爲我產生的問題情況。 從這裏我回按鈕按下。android片段重新加載(onCreate)每次當按鈕按下時按下

片段重新加載與第一次創建時相同,但它應顯示數據,因爲我在離開之前會看到下一個片段。

所以請給我解決方案我可以如何獲取相同的數據,因爲我離開意味着savedInstanceState數據。

即時消息我的第一個片段getCategory方法調用Api和獲取數據第一次當我選擇任何類別我替換片段與另一個片段,但是當我返回相同的getCategory方法召回執行相同的過程,因爲它第一次。

片段不應該在壓縮後再次調用api方法,它應該在此之前顯示的相同類別上點擊。

我的第一個片段,其中調用API ......

public class LandingFragment extends Fragment { 
    // TODO: Rename parameter arguments, choose names that match 
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER 
    private static final String ARG_PARAM1 = "param1"; 
    private static final String ARG_PARAM2 = "param2"; 

    // TODO: Rename and change types of parameters 
    private String mParam1; 
    private String mParam2; 

    private GridLayoutManager gridLayoutManager; 
    private static RecyclerView category_Grid; 
    private Fragment myFragment = null; 
    ProgressBar mProgressView; 
    View mLoginFormView; 
    private Category category; 
    private CategoryAdapter categoryAdapter; 
    private List<CategoryObject> rowListItem; 
    private String productId; 
    private OnFragmentInteractionListener mListener; 

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

    /** 
    * Use this factory method to create a new instance of 
    * this fragment using the provided parameters. 
     * 
     * @param param1 Parameter 1. 
    * @param param2 Parameter 2. 
    * @return A new instance of fragment LandingFragment. 
    */ 
    // TODO: Rename and change types and number of parameters 
    public static LandingFragment newInstance(String param1, String param2) { 
     LandingFragment fragment = new LandingFragment(); 
     Bundle args = new Bundle(); 
     args.putString(ARG_PARAM1, param1); 
     args.putString(ARG_PARAM2, param2); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if (getArguments() != null) { 
      mParam1 = getArguments().getString(ARG_PARAM1); 
      mParam2 = getArguments().getString(ARG_PARAM2); 
     } 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View v= inflater.inflate(R.layout.fragment_landing, container, false); 
     return v; 
    } 

    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 

     initViews(view); 
     RecyclerViewListeners(); 
    } 

    // TODO: Rename method, update argument and hook method into UI event 
    public void onButtonPressed(Uri uri) { 
     if (mListener != null) { 
      mListener.onFragmentInteraction(uri); 
     } 
    } 

    @Override 
    public void onAttach(Activity context) { 
     super.onAttach(context); 

     if (context instanceof OnFragmentInteractionListener) { 
      mListener = (OnFragmentInteractionListener) context; 
     } else { 
      throw new RuntimeException(context.toString() 
        + " must implement OnFragmentInteractionListener"); 
     } 
    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 
     mListener = null; 
    } 

    /** 
     * This interface must be implemented by activities that contain this 
     * fragment to allow an interaction in this fragment to be communicated 
    * to the activity and potentially other fragments contained in that 
    * activity. 
    * <p/> 
    * See the Android Training lesson <a href= 
    *  "http://developer.android.com/training/basics/fragments/communicating.html" 
    * >Communicating with Other Fragments</a> for more information. 
    */ 
    public interface OnFragmentInteractionListener { 
     // TODO: Update argument type and name 
     void onFragmentInteraction(Uri uri); 
    } 

    private void initViews(final View v) { 
     mLoginFormView = (View)v.findViewById(R.id.mainView); 
     mProgressView = (ProgressBar)v.findViewById(R.id.login_progress); 
     category_Grid = (RecyclerView)v.findViewById(R.id.cat_grid); 
     category_Grid.setHasFixedSize(true); 
     gridLayoutManager = new GridLayoutManager(getActivity(), 3); 
     category_Grid.setLayoutManager(gridLayoutManager); 
    } 

private void RecyclerViewListeners(){ 
    category_Grid.addOnItemTouchListener(new RecyclerTouchListener(getActivity(), category_Grid, new ItemClickListener(){ 
     @Override 
     public void onClick(View view, int position) { 

      String entityId = rowListItem.get(position).getCategoryId(); 
      String catName = rowListItem.get(position).getName(); 
      Integer ishave = rowListItem.get(position).getIshaveSubcategories(); 
      if(ishave==1) { 
       myFragment = SubcategoryFragment.newInstance(""+catName, "" + entityId); 
       ActivityUtils.launchFragementWithAnimation(myFragment, getActivity()); 
      }else{ 
       myFragment = ProductListFragment.newInstance("", "" + entityId); 
       ActivityUtils.launchFragementWithAnimation(myFragment, getActivity()); 
      } 
     } 

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

     } 
    })); 
} 

public void getCategory() { 
    showProgress(true); 
    String URL = getResources().getString(R.string.category_api); 
    StringRequest req = new StringRequest(Request.Method.POST,URL, new Response.Listener<String>() { 
     @Override 
     public void onResponse(String response) { 
      VolleyLog.v("Response:%n %s", response); 
      Gson gson = new GsonBuilder().serializeNulls().create(); 
      try { 
       JSONObject jsonObject = new JSONObject(response); 
       if (jsonObject.getString("status").equals(getResources().getString(R.string.response_success))){ 
        category = gson.fromJson(response, Category.class); 
        rowListItem = category.getCategory(); 
        if(navigationUpdated){ 
         someEventListener.someEvent(rowListItem); 
         navigationUpdated = false; 
        } 
        Log.d("CATEGORYID::::::::",""+rowListItem.get(1).getCategoryId()); 
        categoryAdapter = new CategoryAdapter(getActivity(),rowListItem); 
        category_Grid.setAdapter(categoryAdapter); 
        categoryAdapter.notifyDataSetChanged(); 


        return; 
       } 
       else if (jsonObject.getString("status").equals(getResources().getString(R.string.login_Er_respose))){ 
        Log.e("","ERRORRRRRR"); 
        return; 
       } 
      } catch (JSONException e) { 
       showProgress(false); 
       Log.e("My App", "Could not parse malformed JSON: \"" + response + "\""); 
       e.printStackTrace(); 
      } 
     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
       showProgress(false); 
       VolleyLog.e("Error: ", error.getMessage()); 
     } 
    }){ 
     @Override 
     protected Map<String,String> getParams(){ 
      Map<String,String> params = new HashMap<String, String>(); 
      return params; 
     } 

     @Override 
     public Map<String, String> getHeaders() throws AuthFailureError { 
      Map<String,String> params = new HashMap<String, String>(); 
      params.put("Content-Type","application/x-www-form-urlencoded"); 
      return params; 
     } 
    }; 
    AppController.getInstance().addToRequestQueue(req); 
} 

    @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2) 
    private void showProgress(final boolean show) { 

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) { 
     int shortAnimTime = getResources().getInteger(android.R.integer.config_shortAnimTime); 

     mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE); 
     mLoginFormView.animate().setDuration(shortAnimTime).alpha(
       show ? 0 : 1).setListener(new AnimatorListenerAdapter() { 
      @Override 
      public void onAnimationEnd(Animator animation) { 
       mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE); 
      } 
     }); 

     mProgressView.setVisibility(show ? View.VISIBLE : View.GONE); 
     mProgressView.animate().setDuration(shortAnimTime).alpha(
       show ? 1 : 0).setListener(new AnimatorListenerAdapter() { 
      @Override 
      public void onAnimationEnd(Animator animation) { 
       mProgressView.setVisibility(show ? View.VISIBLE : View.GONE); 
      } 
     }); 
    } else { 

     mProgressView.setVisibility(show ? View.VISIBLE : View.GONE); 
     mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE); 
    } 
} 

回答

2

您可以檢查rowListItem.size(),如果它的大小爲0,則調用的getCategory()服務,否則從加載數據您rowListItem ....這裏是我使用從ArrayList中加載數據,如果它不是空的示例代碼......

if (mArrayArticle.size() == 0) { 
         isDataLoading = true; 
         mRecyclerList.setVisibility(View.INVISIBLE); 
         getCategory(); 
        } else { 
         mHomeItemAdapter = new HomeItemAdapter(getActivity(), mArrayArticle, this); 
         mRecyclerList.setAdapter(mHomeItemAdapter); 
        } 

這裏mArrayArticle是我的ArrayList,希望它會幫助你。 ...

+0

感謝@Bhvk_AndroidBee對於這個簡短又甜蜜的回答,我之前很困惑 – Dinesh

+0

我不知道我怎麼也弄不清楚自己弄明白了 – user2875404

0

更多的澄清,我想告訴.. 我如何實現@Bhvk_AndroidBee解決方案

片段backpressed呼叫onActivityCreated方法,以便第一override這種方法在片段

@Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

     //here you can check null condition for rowListItem 
    } 
} 

內onActivityCreated方法我檢查的條件一樣那

@Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     if(rowListItem!=null){ 

      categoryAdapter = new CategoryAdapter(getActivity(),rowListItem); 
      category_Grid.setAdapter(categoryAdapter); 
      categoryAdapter.notifyDataSetChanged(); 

     }else { 

     //call the method for first time creating your view 

      getCategory(); 

     } 
    } 

希望這對更多像我這樣的奮鬥者是有幫助的...

相關問題