0

The problem is that whenever the user go to the third fragment then coming back to the first one, all the data in the first fragment will be gone. the Data will parsed from a web service, using AsyncTask within the fragment

this my onCreate() method

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (getArguments() != null) {
        mParam1 = getArguments().getString(ARG_PARAM1);
        mParam2 = getArguments().getString(ARG_PARAM2);
    }
    int radius = 4;

    double latitude = 51.3674718208489;
    double longtitude = -0.119329656538836;
    Boolean loyal = false;
    int mer = 1;


    try {
        parameters.put(ConstantKeys.SEARCH_NAME, searchname);
        parameters.put(ConstantKeys.LOYALTY, isLoyalty);
        Log.d(CommunityFragment.class.getSimpleName(), parameters.toString());
    } catch (JSONException e) {
        e.printStackTrace();
    }
    FindOfferField();
}

this is my onCreateView() method

public View onCreateView(LayoutInflater inflater, 
                         ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.community_fragment, container, false);

    return rootView;
}

and this is my AsynTask()

public void FindOfferField() {
    RegisterRequest request = new RegisterRequest(getActivity());
    SharedPreferences userpass = getActivity().getSharedPreferences("USERPASS", 0);
    String email = userpass.getString("username", null);
    String password = userpass.getString("password", null);
    Log.d(CommunityFragment.class.getSimpleName(), "Email:" + email + " Password:" + password);
    request.getToken(email, password, new ApiRequestListener() {
        @Override
        public void onSuccess(Object object) {
            (new FindOfferTask() {
                @Override
                protected void onPostExecute(JSONObject data) {
                    super.onPostExecute(data);

                    try {
                        if (data.getString(ConstantKeys.RESULT).equals("OK")) {
                            array = data.getJSONArray(ConstantKeys.RESULTS);

                            RowItem items;
                            rowItem = new ArrayList<RowItem>();
                            for (int i = 0; i < array.length(); i++) {
                                final JSONObject list = array.getJSONObject(i);

                                items = new RowItem();

                                int id = Integer.parseInt(offerList.getString("Id"));
                                byID = id;

                                Log.d("AnotherID", String.valueOf(byID));
                                Boolean isCommunity = offerList.getBoolean(ConstantKeys.IS_COMMUNITY);

                                items.setId(list.getInt("Id"));
                                items.setMerchantid(list.getInt(ConstantKeys.MERCHANTID));
                                items.setDescription(list.getString(ConstantKeys.DESCRIPTION));
                                items.setDateEnd(list.getString(ConstantKeys.DATE).replace("T00:00:00", ""));
                                items.setTokensFor(list.getString(ConstantKeys.FOR));

                                if (!offerList.isNull("ImageId")) {
                                    int bitmapImageID = offerList.getInt("ImageId");
                                    Log.d("BITMAPHAHA", String.valueOf(bitmapImageID));
                                    items.setImageId(bitmapImageID);
                                }

                                rowItem.add(items);



                                listView = (ListView) getView().findViewById(R.id.listViewCommunity);
                                adapter = new CustomListAdapter(getActivity(), rowItem);
                                adapter.notifyDataSetChanged();
                                listView.setAdapter(adapter);
                                getEndTask = new RowItemLoyalty();
                                getTask = new RowItem();

                                listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                                    @Override
                                    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                                        boolean isCommunity = false;
                                        try {
                                            isCommunity = offerList.getBoolean(ConstantKeys.IS_COMMUNITY);
                                        } catch (JSONException e) {
                                            e.printStackTrace();
                                        }
                                        int ID = rowItem.get(position).getId();
                                        int merID = rowItem.get(position).getMerchantid();
                                        Intent intent = new Intent(getActivity(), CustomerPromotion.class);
                                        getEndTask.endTask();
                                        getTask.endTask();
                                        intent.putExtra("ID", ID);
                                        intent.putExtra("MERCHANT", merID);
                                        intent.putExtra("BOOLEANVALUE", isCommunity);

                                        startActivity(intent);
                                    }
                                });
                            }
                            Log.d("JSON Data", data.toString());
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                    Log.d("JSON DATA", data.toString());
                    Log.w("Success Register", data.toString());
                }
            }).execute();
        }

        @Override
        public void onError(String error) {
            Log.e("Registration Error", error);
        }
    });
}

UPDATE

public class CommunityFragment extends ListFragment{


    //LocationListener location;
    ProgressDialog progressDialog;
    Context context;
    public static JSONObject parameters = new JSONObject();

    private static final String STATE_LIST = "State Adapter Data";


    public static final String DATA = "DATA";

    public CustomerAccount customerAccount;

    //---------Find Parameters----------

    int byID;
    //CustomListAdapter adapter;

    public static String TAG = CommunityFragment.class.getSimpleName();

    ListView listView;
    ArrayList<RowItem> rowItem;
    View view;

    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";

    String searchname = ConstantSearch.SEARCHNAME;

    CustomListAdapter adapter;
    private String mParam1;
    private String mParam2;

    RowItemLoyalty getEndTask;
    RowItem getTask;
    RowItem storeData;

    int index;
    int top;
    JSONArray array;


    public CommunityFragment() {

    }

    public static CommunityFragment newInstance(String param1, String param2) {
        CommunityFragment fragment = new CommunityFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

        String dataInJson = new Gson().toJson(rowItem);
        outState.putString(DATA, dataInJson);
        super.onSaveInstanceState(outState);


    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        if(savedInstanceState != null && savedInstanceState.containsKey(DATA))
        {
            Log.d("StringData", DATA);
            String jsonData = savedInstanceState.getString(DATA);
            rowItem = new Gson().fromJson(jsonData, new TypeToken<List<RowItem>>(){}.getType());
        }
        else
        {
            rowItem = new ArrayList<>();
        }
        adapter = new CustomListAdapter(getActivity(), rowItem);
        listView.setAdapter(adapter);

    }

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

        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }
        int radius = 4;

        double latitude = 51.3674718208489;
        double longtitude = -0.119329656538836;
        Boolean isLoyalty = false;
        int mer = 1;


        try {
            parameters.put(ConstantKeys.SEARCH_NAME, searchname);
            parameters.put(ConstantKeys.LOYALTY, isLoyalty);
            Log.d(CommunityFragment.class.getSimpleName(), parameters.toString());
        } catch (JSONException e) {
            e.printStackTrace();
        }
        FindOfferField();
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.community_fragment, container, false);

        rowItem = new ArrayList<RowItem>();
        listView = (ListView) rootView.findViewById(R.id.listViewCommunity);

        return rootView;
    }


    public interface OnFragmentInteractionListener {
        void onFragmentInteraction(Uri uri);
    }

    public void FindOfferField() {


        RegisterRequest request = new RegisterRequest(getActivity());
        SharedPreferences userpass = getActivity().getSharedPreferences("USERPASS", 0);
        String email = userpass.getString("username", null);
        String password = userpass.getString("password", null);
        Log.d(CommunityFragment.class.getSimpleName(), "Email:" + email + " Password:" + password);
        request.getToken(email, password, new ApiRequestListener() {
            @Override
            public void onSuccess(Object object) {
                (new FindOfferTask() {
                    @Override
                    protected void onPostExecute(JSONObject data) {
                        super.onPostExecute(data);

                        try {
                            if (data.getString(ConstantKeys.RESULT).equals("OK")) {
                                array = data.getJSONArray(ConstantKeys.RESULTS);

                                RowItem items;
                                rowItem = new ArrayList<RowItem>();
                                for (int i = 0; i < array.length(); i++) {
                                    final JSONObject offerList = array.getJSONObject(i);

                                    items = new RowItem();

                                    int id = Integer.parseInt(offerList.getString("Id"));
                                    byID = id;

                                    Log.d("AnotherID", String.valueOf(byID));
                                    Boolean isCommunity = offerList.getBoolean(ConstantKeys.IS_COMMUNITY);

                                    items.setId(offerList.getInt("Id"));
                                    items.setMerchantid(offerList.getInt(ConstantKeys.FAVORITE_MERCHANTID));
                                    items.setDescription(offerList.getString(ConstantKeys.DESCRIPTION));
                                    items.setDateEnd(offerList.getString(ConstantKeys.DATE_END).replace("T00:00:00", ""));
                                    items.setTokensFor(offerList.getString(ConstantKeys.TOKENSFOR));

                                    if (!offerList.isNull("ImageId")) {
                                        int bitmapImageID = offerList.getInt("ImageId");
                                        Log.d("BITMAPHAHA", String.valueOf(bitmapImageID));
                                        items.setImageId(bitmapImageID);
                                    }

                                    rowItem.add(items);

                                    adapter = new CustomListAdapter(getActivity(), rowItem);
                                    listView.setAdapter(adapter);

                                    adapter.notifyDataSetChanged();
                                    getEndTask = new RowItemLoyalty();
                                    getTask = new RowItem();

                                    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                                        @Override
                                        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                                            boolean isCommunity = false;
                                            try {
                                                isCommunity = offerList.getBoolean(ConstantKeys.IS_COMMUNITY);
                                            } catch (JSONException e) {
                                                e.printStackTrace();
                                            }
                                            int offerID = rowItem.get(position).getId();
                                            int merID = rowItem.get(position).getMerchantid();
                                            Intent intent = new Intent(getActivity(), CustomerPromotion.class);
                                            getEndTask.endTask();
                                            getTask.endTask();
                                            intent.putExtra("ID", offerID);
                                            intent.putExtra("MERCHANT", merID);
                                            intent.putExtra("BOOLEANVALUE", isCommunity);

                                            startActivity(intent);
                                        }
                                    });
                                }
                                Log.d("JSON Data", data.toString());
                            }
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                        Log.d("JSON DATA", data.toString());
                        Log.w("Success Register", data.toString());
                    }
                }).execute();
            }

            @Override
            public void onError(String error) {
                Log.e("Registration Error", error);
            }
        });
    }


    public class FindOfferTask extends AsyncTask<Void, Void, JSONObject> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            progressDialog = new ProgressDialog(getActivity());
            progressDialog.setMessage("Loading...");
            progressDialog.setCancelable(false);
            progressDialog.show();
        }

        @Override
        protected JSONObject doInBackground(Void... params) {

            ApiSecurityManager manager = ApiSecurityManager.getInstance();
            String result = manager.apiCall("Offers/find", parameters.toString(), "C");
            Log.d(CommunityFragment.class.getSimpleName(), result);

            JSONObject jsonResult = new JSONObject();
            Log.i(getClass().getSimpleName(), result);

            try
            {
                jsonResult = new JSONObject(result);
            }
            catch (JSONException e)
            {
                e.printStackTrace();
            }
            return jsonResult;
        }
        protected void onPostExecute(JSONObject jsonObject) {
            //loadingMore = false;
            progressDialog.dismiss();
        }

    }
}
Faraz
  • 2,144
  • 1
  • 18
  • 28

1 Answers1

0

First of all, keep your view creation outside ApiRequestListener. Initialize all views in onCreateView() only.

// Key for storing data in `savedInstance`
public static final String DATA = "DATA";

In onCreateView()

public View onCreateView(LayoutInflater inflater, 
                         ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.community_fragment, container, false);

    rowItem = new ArrayList<RowItem>();
    listView = (ListView) rootView.findViewById(R.id.listViewCommunity);

    return rootView;
}

When activity is created, check if data is available in savedInstanceState or not and based on that start web service.

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

        if(savedInstanceState.containsKey(DATA))
        {
            String jsonData = savedInstanceState.getString(DATA);
            rowItem = new Gson().fromJson(jsonData, new TypeToken<List<RowItem>>(){}.getType());
        }
        else
        {
            rowItem = new ArrayList<>();
        }
        adapter = new CustomListAdapter(getActivity(), rowItem);
        listView.setAdapter(adapter);

        // Now here, check the size of array list. If it is 0, then start service to fetch data from server
    }

To convert your list into string, I am using Gson library here.

 @Override
public void onSaveInstanceState(Bundle outState)
{
    // Here use gson library from google to convert list of data to string.
    String dataInJson = new Gson().toJson(rowItem);
    outState.putString(DATA, dataInJson);
    super.onSaveInstanceState(outState);
}

And your method will look like this:

public void FindOfferField() {
    RegisterRequest request = new RegisterRequest(getActivity());
    SharedPreferences userpass = getActivity().getSharedPreferences("USERPASS", 0);
    String email = userpass.getString("username", null);
    String password = userpass.getString("password", null);
    Log.d(CommunityFragment.class.getSimpleName(), "Email:" + email + " Password:" + password);
    request.getToken(email, password, new ApiRequestListener() {
        @Override
        public void onSuccess(Object object) {
            (new FindOfferTask() {
                @Override
                protected void onPostExecute(JSONObject data) {
                    super.onPostExecute(data);

                    try {
                        if (data.getString(ConstantKeys.RESULT).equals("OK")) {
                            array = data.getJSONArray(ConstantKeys.RESULTS);

                            RowItem items;

                            for (int i = 0; i < array.length(); i++) {
                                final JSONObject list = array.getJSONObject(i);

                                items = new RowItem();

                                int id = Integer.parseInt(offerList.getString("Id"));
                                byID = id;

                                Log.d("AnotherID", String.valueOf(byID));
                                Boolean isCommunity = offerList.getBoolean(ConstantKeys.IS_COMMUNITY);

                                items.setId(list.getInt("Id"));
                                items.setMerchantid(list.getInt(ConstantKeys.MERCHANTID));
                                items.setDescription(list.getString(ConstantKeys.DESCRIPTION));
                                items.setDateEnd(list.getString(ConstantKeys.DATE).replace("T00:00:00", ""));
                                items.setTokensFor(list.getString(ConstantKeys.FOR));

                                if (!offerList.isNull("ImageId")) {
                                    int bitmapImageID = offerList.getInt("ImageId");
                                    Log.d("BITMAPHAHA", String.valueOf(bitmapImageID));
                                    items.setImageId(bitmapImageID);
                                }

                                rowItem.add(items);
                                adapter.notifyDataSetChanged();
                                getEndTask = new RowItemLoyalty();
                                getTask = new RowItem();

                                listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                                    @Override
                                    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                                        boolean isCommunity = false;
                                        try {
                                            isCommunity = offerList.getBoolean(ConstantKeys.IS_COMMUNITY);
                                        } catch (JSONException e) {
                                            e.printStackTrace();
                                        }
                                        int ID = rowItem.get(position).getId();
                                        int merID = rowItem.get(position).getMerchantid();
                                        Intent intent = new Intent(getActivity(), CustomerPromotion.class);
                                        getEndTask.endTask();
                                        getTask.endTask();
                                        intent.putExtra("ID", ID);
                                        intent.putExtra("MERCHANT", merID);
                                        intent.putExtra("BOOLEANVALUE", isCommunity);

                                        startActivity(intent);
                                    }
                                });
                            }
                            Log.d("JSON Data", data.toString());
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                    Log.d("JSON DATA", data.toString());
                    Log.w("Success Register", data.toString());
                }
            }).execute();
        }

        @Override
        public void onError(String error) {
            Log.e("Registration Error", error);
        }
    });
}

Hope this helps.

Faraz
  • 2,144
  • 1
  • 18
  • 28