Question

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

Was it helpful?

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(); 

    }

OTHER TIPS

just clear your list

add mgList.clear(); in protected void onPreExecute()..

Put these lines in OnCreate() method itself,

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

Use this line in onPostExecute() of the AsynTask class,

msgContent.notifyDataSetChanged();

If this doesn't work try to add static keyword before msglist variable.

In your doInBackground() add below line before starting for loop:

msgList.clear();

You need to call msgList.clear(); before add data in to msgList arrayList. After that in onPostExecute() method just check condition while set adapter in to listview,

      try {
            if (msgList!= null
                    && msgList.size() > 0) {

                msgContent = new MessageAdapter(MyMessagesActivity.this, msgList);
                lv.setAdapter(msgContent);
                msgContent.notifyDataSetChanged();
            } else {
                Toast.makeText(YourActivityName.this,
                        "No Data connection", Toast.LENGTH_SHORT).show();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

Clearing the msgList is not worked for me. And use msgList = new ArrayList>();

in doInBackground() before you adding the new content to the list. And just an info, there is no need to call notifyDataSetChanged() when you set a new instance of the adapter to a listview(And there is no problem if you called the notifyDataSetChanged).

       msgContent = new MessageAdapter(MyMessagesActivity.this, msgList);
       lv.setAdapter(msgContent);
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top