Come aggiornare ListView da AsyncTask?

Sto caricando le immagini usando AsyncTask e per aggiornare ListView che sto usando il metodo notifyDataSetChanged () .

Ma notifyDataSetChanged () non modifica nulla nel ListView onProgressUpdate (). Non voglio utilizzare cursor.requery perché è metodo deprecato.

  • Android HttpUrlConnection EOFException
  • Android Media Player gioca sullo background, ma non si ferma quando l'app è ucciso
  • Come passare argomenti aapt quando si costruisce android apk?
  • Hosting di widget in un lanciatore Android
  • Controllare le autorizzazioni Android in un metodo
  • com.google.android.gms.auth.GoogleAuthException: UNREGISTERED_ON_API_CONSOLE
  • Perché notifyDataSetChanged () non funziona per me?

    public class News extends BasicActivity implements OnItemClickListener{ private SQLiteDatabase db = null; private ListView lvNews; private TaskImgSm taskImgSm = null; private NewsListAdapter adapter; private Cursor cur; boolean pause = false; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.news); db = SQLiteDatabase.openDatabase(((MyApp) getApplication()).getDbPath(), null, SQLiteDatabase.OPEN_READWRITE); lvNews = (ListView) findViewById(R.id.list_news); lvNews.setOnItemClickListener(this); listFilling(); if (taskImgSm != null && taskImgSm.getStatus() != AsyncTask.Status.FINISHED) taskImgSm.cancel(true); taskImgSm = new TaskImgSm(); taskImgSm.execute(); } private void listFilling() { cur = db.query("news", new String[] { "_id", "id_news", "title", "date", "img_url", "img_sm" }, null, null, null, null, null); startManagingCursor(cur); adapter = new NewsListAdapter(this, cur, db); lvNews.setAdapter(adapter); adapter.notifyDataSetChanged(); } class TaskImgSm extends AsyncTask<Void, String, Void> { Cursor curs; @Override protected void onPreExecute() { super.onPreExecute(); curs = db.query("news", new String[] { "_id", "id_news", "img_url", "img_sm" }, null, null, null, null, null); startManagingCursor(curs); } @Override protected Void doInBackground(Void... unused) { curs.moveToFirst(); while (curs.isAfterLast() == false) { if (curs.getBlob(curs.getColumnIndex("img_sm")) == null) { String imgUrl = curs.getString(curs.getColumnIndex("img_url")); String idNews = curs.getString(curs.getColumnIndex("id_news")); updateImg(imgUrl, idNews, "img_sm"); publishProgress(); } curs.moveToNext(); } return (null); } private void updateImg(String img_URL, String whereId, String imgColumn) { try { DefaultHttpClient mHttpClient = new DefaultHttpClient(); HttpGet mHttpGet = new HttpGet(); mHttpGet.setURI(new URI(img_URL)); HttpResponse mHttpResponse = mHttpClient.execute(mHttpGet); if (mHttpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { HttpEntity entity = mHttpResponse.getEntity(); if (entity != null) { // insert to database ContentValues values = new ContentValues(); values.put(imgColumn, EntityUtils.toByteArray(entity)); db.update("news", values, "id_news=" + whereId, null); } } } catch (URISyntaxException e) {e.printStackTrace(); } catch (ClientProtocolException e) {e.printStackTrace(); } catch (IOException e) {e.printStackTrace();} } @Override protected void onProgressUpdate(String... item) { if (pause == false) { adapter.notifyDataSetChanged(); } } @Override protected void onPostExecute(Void unused) {} } @Override protected void onPause() { pause = true; super.onPause(); } @Override protected void onResume() { pause = false; adapter.notifyDataSetChanged(); super.onResume(); } @Override protected void onDestroy() { if (taskImgSm != null && taskImgSm.getStatus() != AsyncTask.Status.FINISHED) taskImgSm.cancel(true); super.onDestroy(); } } 

  • Rendi trasparente la window di dialogo di avviso
  • Android limita il numero di elementi visualizzati nell'elenco a discesa di un filatore
  • Imansible utilizzare il debugger per il progetto android di xamarin: System.IO.FileNotFoundException: Imansible caricare file o assembly Mono.Posix
  • Come implementare Android l10n?
  • set Cosorting tastiera: come impostare l'ordinazione della tastiera x, y
  • Forza un telefono android per dormire, per provare?
  • 3 Solutions collect form web for “Come aggiornare ListView da AsyncTask?”

    Perché non utilizzare un ContentProvider.

    Con un ContentProvider è ansible aggiornare la tabella con il metodo notifyChange (uri)

    Tutorial per quello qui http://thinkandroid.wordpress.com/2010/01/13/writing-your-own-contentprovider/

    Il motivo per cui non funziona è perché notifyDataSetChanged() solo dice a ListView che i dati nella scheda sono stati modificati. Poiché questi dati non sono stati modificati (perché non è stato nuovamente richiesto il database), il ListView non mostrerà alcun aggiornamento. Devi eseguire nuovamente la query e aggiornare i dati nella scheda, quindi call notifyDatasetChanged() .

    Penso che si desideri aggiornare l' ImageView in un ListView nel metodo onPostExecute() . Così ho realizzato qualcosa di simile a quello che stai facendo: Multithreading For Performance

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.