2016-12-31 1 views
0

J'ai un listview qui charge des données à partir du serveur. Les données se chargent correctement, mais après un certain temps et en faisant défiler la liste, l'application se bloque et j'obtiens le message "données reçues mais l'adaptateur n'est pas averti!" Ce qui suit est mon code:Android ListView notifier

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


    @Override 
    protected Void doInBackground(Void... voids) { 
     applicationList = new ArrayList(); 
     applicationList.clear(); 
     try { 
      JSONArray jsonData = new GetListviewsData().getJSONData(webfileName, limit, offset, priceCat); 

      for (int i = 0; i <= jsonData.length() - 2; i++) { 
       JSONObject c = jsonData.getJSONObject(i); 

       id = c.getString("id"); 
       name = c.getString("name"); 
       logo = c.getString("logo"); 
       developer = c.getString("developer"); 
       category = c.getInt("category"); 
       fileName = c.getString("filename"); 
       path = c.getString("path"); 
       appSize = c.getDouble("size_bytes"); 
       price = c.getInt("price"); 
       data = c.getString("data1").equals("t"); 
       obb = c.getString("data").equals("t"); 
       applicationList.add(new ApplicationPojo(id, name, logo, developer, appSize, category, fileName, path, data, obb, price)); 
      } 
      JSONObject sizeObj = jsonData.getJSONObject(jsonData.length() - 1); 
      listSize = sizeObj.getInt("size"); 
     } catch (Exception ex) { 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) { 
     super.onPostExecute(aVoid); 

     if(listSize == 0){ 
      TextView noResult = (TextView) findViewById(R.id.noresult); 
      noResult.setVisibility(View.VISIBLE); 
      mProgressDialog.dismiss(); 

     }else{ 
      adapter = new ListViewAppAdapter(ListViewAppAll.this, applicationList, listview); 
      listview.setAdapter(adapter); 
      mProgressDialog.dismiss(); 

      listview.setOnScrollListener(new AbsListView.OnScrollListener() { 

       @Override 
       public void onScrollStateChanged(AbsListView view, int scrollState) { 
        int threshold = 1; 
        int count = listview.getCount(); 

        if (scrollState == SCROLL_STATE_IDLE) { 
         if (listview.getLastVisiblePosition() >= count - threshold) { 
          if (listSize >= offset) { 
           offset = offset + 15; 
           new LoadMoreData().execute(); 

          } else { 
           Toast.makeText(getApplicationContext(), "End of list!", Toast.LENGTH_LONG).show(); 
           listview.removeFooterView(footer); 
          } 
         } 
        } 
       } 

       @Override 
       public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
        // TODO Auto-generated method stub 
       } 
      }); 
     } 
    } 
} 

private class LoadMoreData extends AsyncTask<Void, Void, Void> { 
    @Override 
    protected Void doInBackground(Void... voids) { 
     try { 
      GetListviewsData getDataAppList = new GetListviewsData(); 

      JSONArray jsonData = getDataAppList.getJSONData(webfileName, limit, offset, priceCat); 

      for (int i = 0; i <= jsonData.length(); i++) { 
       JSONObject c = jsonData.getJSONObject(i); 

       id = c.getString("id"); 
       name = c.getString("name"); 
       logo = c.getString("logo"); 
       developer = c.getString("developer"); 
       category = c.getInt("category"); 
       fileName = c.getString("filename"); 
       path = c.getString("path"); 
       appSize = c.getDouble("size_bytes"); 
       price = c.getInt("price"); 
       data = c.getString("data1").equals("t"); 
       obb = c.getString("data").equals("t"); 
       applicationList.add(new ApplicationPojo(id, name, logo, developer, appSize, category, fileName, path, data, obb, price)); 
      } 
     } catch (Exception ex) { 

     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) { 
     adapter.notifyDataSetChanged(); 
    } 
} 

s'il vous plaît aidez-moi avec ceci. Merci

+0

chaque fois que vous définissez les données à l'adaptateur. utilisez adapter.notifyDatasetChanged(); –

+0

Merci pour votre réponse! l'adaptateur est notifié sur la méthode onPostExecute – Shoaib

+0

dans votre code, vous avez seulement utilisé cette fois. mais vous définissez les données plusieurs fois –

Répondre

1

J'ai apporté quelques modifications à votre code.

changements,

  • Au lieu d'ajouter les éléments un à mon seul applicationList, ajouter à la fois à l'aide addAll et appelez notifyDataSetChanged. Cela devrait supprimer l'erreur.
  • Initialisez le adapter dans oncreate. Utilisez un AsyncTask au lieu de deux.
  • Utiliser un seul AsyncTaskdoInbackground renvoie ArrayList au lieu de void.

Voir le code ci-dessous,

// start from 0 
int offset = 0; 

// create dataset 
ArrayList<ApplicationPojo> applicationList = new ArrayList(); 

// create adapter 
ListViewAppAdapter adapter; 

onCreate(){ 
    ... 

    TextView noResult = (TextView) findViewById(R.id.noresult); 

    adapter = new ListViewAppAdapter(ListViewAppAll.this, applicationList, listview); 
    listview.setAdapter(adapter); 

    listview.setOnScrollListener(new AbsListView.OnScrollListener() { 

     @Override 
     public void onScrollStateChanged(AbsListView view, int scrollState) { 
      int threshold = 1; 
      int count = listview.getCount(); 

      if (scrollState == SCROLL_STATE_IDLE) { 
       if (listview.getLastVisiblePosition() >= count - threshold) { 
        if (listSize >= offset) { 
         offset = offset + 15; 
         new LoadData().execute(); 

        } else { 
         Toast.makeText(getApplicationContext(), "End of list!", Toast.LENGTH_LONG).show(); 
         listview.removeFooterView(footer); 
        } 
       } 
      } 
     } 

     @Override 
     public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 

     } 
    }); 
} 

private class LoadData extends AsyncTask<Void, Void, ArrayList<ApplicationPojo>> { 

    @Override 
    protected Void doInBackground(Void... voids) { 
     ArrayList<ApplicationPojo> temp = new ArrayList(); 

     try { 
      JSONArray jsonData = new GetListviewsData().getJSONData(webfileName, limit, offset, priceCat); 

      for (int i = 0; i < jsonData.length() - 1; i++) { 
       JSONObject c = jsonData.getJSONObject(i); 

       id = c.getString("id"); 
       name = c.getString("name"); 
       logo = c.getString("logo"); 
       developer = c.getString("developer"); 
       category = c.getInt("category"); 
       fileName = c.getString("filename"); 
       path = c.getString("path"); 
       appSize = c.getDouble("size_bytes"); 
       price = c.getInt("price"); 
       data = c.getString("data1").equals("t"); 
       obb = c.getString("data").equals("t"); 
       temp.add(new ApplicationPojo(id, name, logo, developer, appSize, category, fileName, path, data, obb, price)); 
      } 
      JSONObject sizeObj = jsonData.getJSONObject(jsonData.length() - 1); 
      listSize = sizeObj.getInt("size"); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
     return temp; 
    } 

    @Override 
    protected void onPostExecute(ArrayList<ApplicationPojo> list) { 
     if(listSize == 0) { 
      noResult.setVisibility(View.VISIBLE); 
     } else { 
      applicationList.addAll(list); 
      applicationList.notifyDataSetChanged(); 
     } 
     mProgressDialog.dismiss(); 
    } 
} 
+0

Merci laissez-moi essayer! – Shoaib

+0

J'ai mis en œuvre le code ci-dessus, mais il donne une exception de pointeur null à public int getCount() { return applicationList.size(); } sur la classe d'adaptateur – Shoaib

+0

Avez-vous ajouté 'ArrayList applicationList = new ArrayList();' avant 'onCreate'? –