Search code examples
androidandroid-listviewcustom-adapternotifydatasetchanged

old data in the ListView remains there when i bind new values to ListView in android


I have one ListView,I have made a custom adapter for binding data to it,I have made an asynctask in the activity for getting data and display it into the listView,I have two different Urls for the same asyctask ,based on the condition i am using it,Thing is that when i am second time the listView doesn't remove the previous values.

main.java

public class MyMessagesActivity extends Activity {
    private ProgressDialog pDialog;
    JSONArray msgArry;
    private MessageAdapter msgContent;
    ArrayList<HashMap<String, String>> msgList;
    ListView lv;
    JSONArray msgs = null;
    String pro_id, pro_name, pro_img, pro_unit;
    TextView tv_switch;
    public boolean flag = false;
    Header header;
    Menu menu;

    String url;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_messgaes);
        lv = (ListView) findViewById(R.id.list);
        tv_switch = (TextView) findViewById(R.id.tv_switch);
        header = (Header) findViewById(R.id.header_msg);
        menu = (Menu) findViewById(R.id.menu_msg);
        menu.setSelectedTab(3);
        header.title.setText("Messages");
        msgList = new ArrayList<HashMap<String, String>>();
        // url = "?customer_id=" + Pref.getValue(MyMessagesActivity.this,
        // Const.PREF_CUSTOMER_ID, "") + "&group_id=2";

        tv_switch.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                if (flag) {
                    tv_switch.setText("Switch to supplier");
                    new GetMessages().execute();
                    flag = false;
                } else {
                    tv_switch.setText("Switch to buyer");
                    new GetMessages().execute();
                    flag = true;
                }
            }
        });
        // AsyncTAsk for Wholesale Product List...!!!

        new GetMessages().execute();

        lv.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                // getting values from selected ListItem

                // in = new Intent(getApplicationContext(),
                // ProductDetailActivity.class);
                /*
                 * pro_name = ((TextView)
                 * view.findViewById(R.id.product_label)).getText().toString();
                 * 
                 * // getting ProductId from the tag...
                 * 
                 * pro_id = msgList.get(position).get(Const.TAG_PRODUCT_ID);
                 * pro_name = msgList.get(position).get(Const.TAG_PRODUCT_NAME);
                 * pro_img = msgList.get(position).get(Const.TAG_PRODUCT_IMG);
                 * System.out.println(
                 * ":::::::::::::::;;THE INTENT FOR THE PRODUCUT DETIALS ACTIVITY================="
                 * + pro_name); Toast.makeText(MyMessagesActivity.this,
                 * pro_name, Toast.LENGTH_SHORT).show();
                 */
                // startActivity(in);
            }

        });
    }

    private class GetMessages extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(MyMessagesActivity.this);
            pDialog.setMessage("Please wait...");
            pDialog.setCancelable(false);
            pDialog.show();

        }

        @Override
        protected Void doInBackground(Void... arg0) {
            // Creating service handler class instance
            BackendAPIService sh = new BackendAPIService();
            String query = Const.API_MESSAGES;
            if (flag) {
                url = "?customer_id=" + Pref.getValue(MyMessagesActivity.this, Const.PREF_CUSTOMER_ID, "") + "&group_id=1";
            } else {
                url = "?customer_id=" + Pref.getValue(MyMessagesActivity.this, Const.PREF_CUSTOMER_ID, "") + "&group_id=2";
            }

            url = url.replace(" ", "%20");
            url = query + url;
            System.out.println(":::::::::::::My MESSGES URL::::::::::::::" + url);

            // Making a request to url and getting response
            String jsonStr = sh.makeServiceCall(url, BackendAPIService.GET);

            Log.d("Response: ", "> " + jsonStr);
            try {
                if (jsonStr != null) {
                    msgArry = new JSONArray(jsonStr);
                    if (msgArry != null && msgArry.length() != 0) {
                        // looping through All Contacts

                        System.out.println(":::::::::::FLAG IN SUB:::::::::::" + msgArry.length());
                        for (int i = 0; i < msgArry.length(); i++) {
                            JSONObject c = msgArry.getJSONObject(i);

                            String custID = c.getString(Const.TAG_CUSTOMER_ID);
                            String custName = c.getString(Const.TAG_CUSTOMER_NAME);
                            String proID = c.getString(Const.TAG_PRODUCT_ID);
                            String email = c.getString(Const.TAG_CUSTOMER_EMAIL);
                            String photo = Const.API_HOST + "/" + c.getString(Const.TAG_PHOTO);
                            String subject = c.getString(Const.TAG_SUBJECT);
                            String msg_read = c.getString(Const.TAG_MESSAGE_READ);
                            HashMap<String, String> message = new HashMap<String, String>();

                            message.put(Const.TAG_CAT_ID, custID);
                            message.put(Const.TAG_CUSTOMER_NAME, custName);
                            message.put(Const.TAG_PRODUCT_ID, proID);
                            message.put(Const.TAG_CUSTOMER_EMAIL, email);
                            message.put(Const.TAG_PHOTO, photo);
                            message.put(Const.TAG_SUBJECT, subject);
                            message.put(Const.TAG_MESSAGE_READ, msg_read);

                            msgList.add(message);

                        }
                    } else {
                        runOnUiThread(new Runnable() {

                            @Override
                            public void run() {
                                Utils.showCustomeAlertValidation(MyMessagesActivity.this, "No messgaes found", "yehki", "Ok");

                            }
                        });

                    }

                } else {
                    Log.e("ServiceHandler", "Couldn't get any data from the url");
                }
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            // Dismiss the progress dialog
            if (pDialog.isShowing())
                pDialog.dismiss();

            msgContent = new MessageAdapter(MyMessagesActivity.this, msgList);
            msgContent.notifyDataSetChanged();
            lv.setAdapter(msgContent);

        }
    }
}

Please help me for it,thank you eve-one


Solution

  • Try to remove the old records from your HashMap arraylist as below to remove all the data from arraylist.

    After binding the data into ListView just clear your arraylist as below:

       @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            // Dismiss the progress dialog
            if (pDialog.isShowing())
                pDialog.dismiss();
    
            msgContent = new MessageAdapter(MyMessagesActivity.this, msgList);
            msgContent.notifyDataSetChanged();
            lv.setAdapter(msgContent);
    
          msgList.clear(); 
    
        }