Android-notifyDataSetChanged not working on BaseAdapter

I have a list in my activity, when I get to the end of the list, it calls async and gets new data using json. these are the async and baseAdaper codes:

ListAdapter ladap; private class GetContacts AsyncTask<Void, Void,ArrayList<HashMap<String, String>>> { @Override protected Void doInBackground(Void... arg0) { Spots_tab1_json sh = new Spots_tab1_json(); String jsonStr = sh.makeServiceCall(url + page, Spots_tab1_json.GET); ArrayList<HashMap<String, String>> dataC = new ArrayList<HashMap<String, String>>(); if (jsonStr != null) { try { JSONObject jsonObj = new JSONObject(jsonStr); contacts = jsonObj.getJSONArray(TAG_CONTACTS); for (int i = 0; i < contacts.length(); i++) { JSONObject c = contacts.getJSONObject(i); String id = new String(c.getString("id").getBytes("ISO-8859-1"), "UTF-8"); String dates = new String(c.getString("dates").getBytes("ISO-8859-1"), "UTF-8"); String price = new String(c.getString("gheymat").getBytes("ISO-8859-1"), "UTF-8"); HashMap<String, String> contact = new HashMap<String, String>(); contact.put("id", id); contact.put("dates", dates); contact.put("price", price); dataC.add(contact); } } } catch (JSONException e) { goterr = true; } catch (UnsupportedEncodingException e) { goterr = true; } } else { goterr = true; } return dataC; } @Override protected void onPostExecute(ArrayList<HashMap<String, String>> result) { super.onPostExecute(result); if (!isCancelled() && goterr == false) { if(ladap==null){ ladap=new ListAdapter(MainActivity.this,result); lv.setAdapter(ladap); }else{ ladap.addAll(result); ladap.notifyDataSetChanged(); } } 

}

 public class ListAdapter extends BaseAdapter { Activity activity; public ArrayList<HashMap<String, String>> list; public ListAdapter(Activity activity,ArrayList<HashMap<String, String>> list) { super(); this.activity = (Activity) activity; this.list = list; } public void addAll(ArrayList<HashMap<String, String>> result) { Log.v("this",result.size()+" resultsize"); this.list = result; notifyDataSetChanged(); } public int getCount() { return contactList.size(); } public Object getItem(int position) { return contactList.get(position); } public long getItemId(int arg0) { return 0; } private class ViewHolder { TextView title,price; ImageView img ; //RelativeLayout rl; } public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; LayoutInflater inflater = activity.getLayoutInflater(); if (convertView == null) { convertView = inflater.inflate(R.layout.item, null); holder = new ViewHolder(); holder.title = (TextView) convertView.findViewById(R.id.title); holder.price = (TextView) convertView.findViewById(R.id.price); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } item = contactList.get(position); holder.price.setText(item.get("price")); return convertView; } } 

I registered here, when I reached the end of the View list, it calls addAll, and it returns 30 new items that they buy, they are not added to the listview, I don’t know why.

+5
source share
2 answers

First of all, you already notify your list when you call addAll (), so this code is no longer required, please remove from your code:

 ladap.notifyDataSetChanged(); 

Add new data to the list data storage list, instead of assigning new data to view the data list:

 public void addAll(ArrayList<HashMap<String, String>> result) { Log.v("this",result.size()+" resultsize"); this.list = result; notifyDataSetChanged(); } 

Replaced by:

 public void addAll(ArrayList<HashMap<String, String>> result) { Log.v("this",result.size()+" resultsize"); if(list==null){ list = new ArrayList<HashMap<String, String>>(); } list.addAll(result) notifyDataSetChanged(); } 
+6
source

Try changing this:

 public void addAll(ArrayList<HashMap<String, String>> result) { Log.v("this",result.size()+" resultsize"); this.list = result; notifyDataSetChanged(); } 

To:

 public void addAll(ArrayList<HashMap<String, String>> result) { Log.v("this",result.size()+" resultsize"); for(int i = 0;i < result.size(); i++) list.add(result.get(i)); //notifyDataSetChanged(); //no need to call again here } 

The fact is that this.list = result; will delete old items before adding a new item.

+2
source

Source: https://habr.com/ru/post/1206469/


All Articles