Barra de progreso de la actualización en listview para archivos múltiples descarga

Cómo podemos actualizar una barra de progreso en ListView. Cuando cada barra de progreso está asociada a la descarga de un archivo y que se realiza a través de AsyncTask.

La función será:

  1. Cada barra de progreso se actualizará con el proceso de descarga.
  2. Cuando un archivo completo descargado se guardará en la tarjeta sd.
  3. Se le agregará servicio (Correr sobre el fondo.
  4. Cuando un archivo descargado debe mostrar "Completo" (no debe ser remove listview formulario)

También utilicé una base de datos para descargar el archivo. La lista también depende del vector de la base de datos. ¿Cómo puedo implementarlo? También intenté pero no conseguí la solución.

A continuación se presentan las dos capturas de pantalla para describirlo en detalle:

Introduzca aquí la descripción de la imagen

También intenté este código:

temp = databaseHandler.getAllNotifyNumber(); list_download = (ListView) findViewById(R.id.list_download); myCustomAdapter = new MyCustomAdapter(mContext); list_download.setAdapter(myCustomAdapter); myCustomAdapter.notifyDataSetChanged(); for (int index = 0; index < temp.size(); index++) { String url = "http://upload.wikimedia.org/wikipedia/commons/0/05/Sna_large.png"; grabURL(url); } 

Esto es AsyncTask mathod:

  public void grabURL(String url) { new GrabURL().execute(url); } private class GrabURL extends AsyncTask<String, Integer, String> { protected String doInBackground(String... urls) { String filename = "MySampleFile.png"; File myFile = new File(directory, filename); try { URL url = new URL(urls[0]); URLConnection connection = url.openConnection(); connection.connect(); int fileSize = connection.getContentLength(); InputStream is = new BufferedInputStream(url.openStream()); OutputStream os = new FileOutputStream(myFile); byte data[] = new byte[1024]; long total = 0; int count; while ((count = is.read(data)) != -1) { total += count; publishProgress((int) (total * 100 / fileSize)); os.write(data, 0, count); } os.flush(); os.close(); is.close(); } catch (Exception e) { e.printStackTrace(); } return filename; } @Override protected void onProgressUpdate(Integer... progress) { // home_countprogress.setVisibility(View.VISIBLE); // home_countprogress.setText(String.valueOf(progress[0]) + "%"); // progressbar_horizontal.setProgress(progress[0]); myCustomAdapter.notifyDataSetChanged(); } @Override protected void onCancelled() { Toast toast = Toast.makeText(getBaseContext(), "Error connecting to Server", Toast.LENGTH_LONG); toast.setGravity(Gravity.TOP, 25, 400); toast.show(); } @Override protected void onPostExecute(String filename) { // progressbar_horizontal.setProgress(100); // home_countprogress.setVisibility(View.VISIBLE); } protected void onPreExecute() { // progressbar_horizontal.setVisibility(View.VISIBLE); // progressbar_horizontal.setProgress(0); // home_countprogress.setVisibility(View.VISIBLE); myCustomAdapter = new MyCustomAdapter(mContext); } } 

En lugar de notificar a su adaptador cada vez que su progreso cambia (que es todo el tiempo) y hacer esto completamente ineficiente puede intentar hacer lo siguiente.

  • Cree una vista personalizada para cada fila en el ListView
  • Añada un método allí llamado 'setData ()' o algo. Llame a esto en la devolución de llamada getView () del adaptador, estableciendo los datos para esa vista.
  • Dentro de 'setData ()' registra esa vista como escucha para las actualizaciones de progreso de la tarea asíncrona.
  • Anule onStartTemporaryDetach () y onDetachedFromWindow () dentro de su vista personalizada. Asegúrese de anular su registro de las actualizaciones de tareas asíncronas allí (de lo contrario obtendrá una pérdida de memoria).
  • En su tarea asíncrona, simplemente notifique a todos los oyentes registrados (que probablemente se celebren en un mapa de urls a los oyentes o algo así).

En lugar de usar ListView, pruebe esto:

Crear un diseño que contenga tus cosas + ProgresseBar parecerá así

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="3dp"> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <ProgressBar android:id="@+id/progressBar" style="?android:attr/progressBarStyleHorizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/image" android:visibility="gone" /> </LinearLayout> 

Y en el diseño de su actividad / fragmento reemplazar su ListView por un LinearLayout (o LinearLayout dentro de un ScrollView) con las mismas propiedades que su listview:

 <ScrollView android:id="@+id/scrollView1" android:layout_width="wrap_content" android:layout_height="wrap_content"> <LinearLayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > </LinearLayout> </ScrollView 

Y en su actividad crear una función:

 private void addMyView(String url){ LayoutInflater mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); View mView = mInflater.inflate(R.layout.my_layout, null, false); ProgressBar mBar = (ProgressBar) mView.findViewById(R.id.progress); container.addView(mView); grabURL(url); // starting your task here 

}

También no olvide su LinearLayout:

 LinearLayout container = (LinearLayout) findViewById(R.id.container); 

entonces :

 for (int index = 0; index < temp.size(); index++) { String url = "http://upload.wikimedia.org/wikipedia/commons/0/05/Sna_large.png"; addMyView(url);`enter code here } 

Espero que la ayuda 🙂

  • ¿Cómo descargar archivos (pdf, doc etc ...) en sdcard y abrir el archivo utilizando volley en android?
  • Android 2.2 y 2.3 descarga de PDF a través de HTTPS parece roto
  • Descargar un archivo con DefaultHTTPClient y autenticación preventiva
  • PARTIAL_WAKE_LOCK vs SCREEN_DIM_WAKE_LOCK en el subproceso de descarga
  • Cómo abrir el archivo descargado en android con la aplicación predeterminada predeterminada en android
  • ¿Dónde puedo descargar la documentación de Android SDK?
  • Descargar .apk se convierte en .txt en el teléfono
  • Cómo detener un IntentService?
  • Cómo detener un IntentService mientras hay muchos IntentService en ejecución
  • Descargar vídeo de Url con Retrofit
  • Android Descargar File by AsyncTask no funciona con 3G solo con Wi-Fi
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.