2014-11-08 3 views
5

У меня есть список в моей активности, когда я добираюсь до конца списка, он вызывает async и получает новые данные с помощью json. это Асинхронная и baseAdaper кода:android-notifyDataSetChanged не работает на BaseAdapter

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; 
} 
} 

Я вошел сюда, когда я добираюсь до конца ListView, он называет addAll и возвращает новые 30 пунктов купить его не добавлено в список, я не знаю почему.

ответ

6

Прежде всего вы уже известите вид списка, если вы звоните addAll() так что этот код больше не требуется, пожалуйста, удалите из вашего кода:

ladap.notifyDataSetChanged(); 

Добавить новые данные в перечисляют держатель данных вида вместо Присвоить новые данные в список обладателя вида данных:

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

Заменить:

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(); 
} 
+0

это работает, спасибо большое –

+0

Рад помочь вам .. –

+0

Да, это то, что я имею в виду..LOL :) –

2

Попробуйте изменить:

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 
} 

Дело в том, я думаю, this.list = result; будет удалять старые элементы, прежде чем добавить новый элемент.

Смежные вопросы