Android fragments 每次按下后退按钮时都会重新加载android片段(onCreate)

Android fragments 每次按下后退按钮时都会重新加载android片段(onCreate),android-fragments,savestate,onbackpressed,recreate,Android Fragments,Savestate,Onbackpressed,Recreate,我是android新手,在我的项目中使用片段。第一次创建片段时,调用api并在片段中加载数据。在这里,当我点击任何一个项目时,我用另一个片段替换了片段,并调用了另一个api,将数据加载到片段中。 现在这里的问题情况为我产生。 从这里我按下了后退按钮 片段重新加载和第一次创建相同,但在转到下一个片段之前,应该显示我离开时的数据 所以,请为我提供一个解决方案,如何获得与我离开时相同的数据意味着保存状态数据 我的第一个片段getCategory方法调用Api并第一次获取数据当我选择任何类别时,我用另一

我是android新手,在我的项目中使用片段。第一次创建片段时,调用api并在片段中加载数据。在这里,当我点击任何一个项目时,我用另一个片段替换了片段,并调用了另一个api,将数据加载到片段中。 现在这里的问题情况为我产生。 从这里我按下了后退按钮

片段重新加载和第一次创建相同,但在转到下一个片段之前,应该显示我离开时的数据

所以,请为我提供一个解决方案,如何获得与我离开时相同的数据意味着保存状态数据

我的第一个片段getCategory方法调用Api并第一次获取数据当我选择任何类别时,我用另一个片段替换片段,但当我返回相同的getCategory方法调用时,执行与第一次相同的过程

片段不应该再次在backpressed上调用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);
    }
}
public类LandingFragment扩展了Fragment{
//TODO:重命名参数参数,选择匹配的名称
//片段初始化参数,例如ARG_ITEM_NUMBER
私有静态最终字符串ARG_PARAM1=“PARAM1”;
私有静态最终字符串ARG_PARAM2=“PARAM2”;
//TODO:重命名和更改参数类型
私有字符串mParam1;
私有字符串mParam2;
专用GridLayoutManager GridLayoutManager;
私有静态RecyclerView类别网格;
私有片段myFragment=null;
ProgressBar mProgressView;
视图mloginfo视图;
私人类别;
私有类别适配器类别适配器;
私有列表行列表项;
私有字符串productId;
私有OnFragmentInteractionListener mListener;
公共着陆碎片(){
//必需的空公共构造函数
}
/**
*使用此工厂方法创建的新实例
*使用提供的参数创建此片段。
*
*@param param1参数1。
*@param param2参数2。
*@return一个fragment LandingFragment的新实例。
*/
//TODO:重命名和更改参数的类型和数量
公共静态LandingFragment newInstance(字符串param1,字符串param2){
LandingFragment=新的LandingFragment();
Bundle args=新Bundle();
args.putString(ARG_PARAM1,PARAM1);
args.putString(ARG_PARAM2,PARAM2);
fragment.setArguments(args);
返回片段;
}
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
如果(getArguments()!=null){
mParam1=getArguments().getString(ARG_PARAM1);
mParam2=getArguments().getString(ARG_PARAM2);
}
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
//为该碎片膨胀布局
视图v=充气机。充气(右布局。碎片着陆,集装箱,假);
返回v;
}
@凌驾
已创建视图上的公共void(视图,捆绑保存状态){
super.onViewCreated(视图,savedInstanceState);
初始视图(视图);
RecycleServiceWLListeners();
}
//TODO:重命名方法、更新参数并将方法挂接到UI事件中
public void onButtonPressed(Uri){
if(mListener!=null){
onFragmentInteraction(uri);
}
}
@凌驾
公共活动(活动上下文){
super.onAttach(上下文);
if(OnFragmentInteractionListener的上下文实例){
mListener=(OnFragmentInteractionListener)上下文;
}否则{
抛出新的RuntimeException(context.toString()
+“必须实现OnFragmentInteractionListener”);
}
}
@凌驾
公共无效连接(){
super.onDetach();
mListener=null;
}
/**
*此接口必须由包含以下内容的活动实现
*片段,以允许通信此片段中的交互
*该活动以及其中可能包含的其他片段
*活动。
*

*有关更多信息,请参阅Android培训课程。 */ FragmentInteractionListener上的公共接口{ //TODO:更新参数类型和名称 void onFragmentInteraction(Uri); } 私有视图(最终视图v){ mloginfo视图=(视图)v.findviewbyd(R.id.mainView); mProgressView=(ProgressBar)v.findviewbyd(R.id.login\u progress); 类别网格=(RecyclerView)v.findViewById(R.id.cat网格); 类别网格。setHasFixedSize(真); gridLayoutManager=新的gridLayoutManager(getActivity(),3); 类别\网格。setLayoutManager(网格布局管理器); } 私有void RecycleServiceWLListeners(){ category_Grid.addOnItemTouchListener(新的RecyclerTouchListener(getActivity(),category_Grid,新的ItemClickListener()){ @凌驾 公共void onClick(视图,int位置){ String entityId=rowListItem.get(位置).getCategoryId(); String catName=rowListItem.get(position).getName(); 整数ishave=rowListItem.get(position).getIshaveSubcategories(); 如果(ishave==1){ myFragment=subcategory fragment.newInstance(“+catName,”+entityId); ActivityUtils.launchFragementWithAnimation(myFragment,getActivity()); }否则{ myFragment=ProductListFragment.newInstance(“,”+entityId); ActivityUtils.launchFragementWithAnimation(myFragment,getActivity()); } } @凌驾 仅长按公共无效(视图,int位置){ } })); } 公共类别(){ showPr

if (mArrayArticle.size() == 0) {
    isDataLoading = true;
    mRecyclerList.setVisibility(View.INVISIBLE);
    getCategory();
} else {
    mHomeItemAdapter = new HomeItemAdapter(getActivity(), mArrayArticle, this);
    mRecyclerList.setAdapter(mHomeItemAdapter);
}
  @Override
    public void onActivityCreated(Bundle savedInstanceState) {
       super.onActivityCreated(savedInstanceState);

      //here you can check null condition for rowListItem
    }
}
    @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();

       }
    }