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á:
- Android sync / descargar marco
- Android - ¿Cómo descargar una imagen y usarla como nuevo recurso?
- La descarga de WebView abre la ventana del navegador por un breve momento antes de volver a WebView
- Descargar y guardar imágenes con Picasso
- ¿Cómo descargar el archivo con el servicio en android?
- Cada barra de progreso se actualizará con el proceso de descarga.
- Cuando un archivo completo descargado se guardará en la tarjeta sd.
- Se le agregará servicio (Correr sobre el fondo.
- 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:
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); } }
- Cómo descargar de forma programática una página HTML en android y obtener su Html?
- Descarga de archivos en Android
- Cómo instalar APK automáticamente cuando se completa la descarga del archivo (alojado en privado)
- ¿Dónde puedo descargar los documentos de la API para Android?
- Descargar varios archivos utilizando un servicio en android
- ¿Cómo puedo descargar un archivo a mi carpeta de descargas android
- ¿Cómo puedo usar Android para descargar un archivo basado en sesión / cookie usando webView?
- ¿Cómo utilizo DownloadListener?
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 🙂
- Abrir una URL con el navegador nativo de PlayBook desde una aplicación basada en Android
- ViewPagerAndroid no se representa bajo ScrollView utilizando React-Native