Actualización de la barra de progreso en la vista de lista

Tengo un escenario, En mi aplicación de chat quiero enviar fotos, envío de fotos lleva tiempo. He adjuntado una barra de progreso (horizontal) para mostrar el progreso del envío de la foto en mi aplicación. Pero no puedo actualizar la barra de progreso, ya que es el elemento de la vista de lista personalizada.

Esta es mi asynchtask para establecer el progreso de Progress Bar, pero no soy capaz de obtenerlo.

class SendPhotoToFriend extends AsyncTask<String, String, String>{ String receiver,path = ""; public SendPhotoToFriend(String path,String receiver) { // TODO Auto-generated constructor stub this.path = path; this.receiver = receiver; } @Override protected String doInBackground(String... arg0) { // TODO Auto-generated method stub ServiceDiscoveryManager sdm = ServiceDiscoveryManager .getInstanceFor(connection); if (sdm == null) sdm = new ServiceDiscoveryManager(connection); sdm.addFeature("http://jabber.org/protocol/disco#info"); sdm.addFeature("jabber:iq:privacy"); // Create the file transfer manager FileTransferManager manager = new FileTransferManager( connection); FileTransferNegotiator.setServiceEnabled(connection, true); // Create the outgoing file transfer OutgoingFileTransfer transfer = manager .createOutgoingFileTransfer(receiver + "/Smack"); System.out.println("Receiver of the file is "+receiver+"/smack"); Log.i("transfere file", "outgoingfiletransfer is created"); try { long total = 0; OutgoingFileTransfer.setResponseTimeout(30000); transfer.sendFile(new File(path), "Description"); Log.i("transfere file", "sending file"); while (!transfer.isDone()) { //Thread.sleep(1000); total+=transfer.getProgress(); publishProgress(""+(int)((total*100)/transfer.getFileSize())); Log.i("transfere file", "sending file status " + transfer.getStatus() + "progress: " + transfer.getProgress()); if (transfer.getStatus() == org.jivesoftware.smackx.filetransfer.FileTransfer.Status.error) { Log.i("transfere file", "Errorrr isss: " + transfer.getError()+transfer.getPeer()); transfer.cancel(); break; } } } catch (XMPPException e) { // TODO Auto-generated catch block e.printStackTrace(); } Log.i("transfere file", "sending file done"); return null; } @Override protected void onProgressUpdate(final String... values) { // TODO Auto-generated method stub super.onProgressUpdate(values); LayoutInflater inflater = (LayoutInflater)getBaseContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); final View view =inflater.inflate(R.layout.user_chat_send_chat, null); ProgressBar p_Bar = (ProgressBar)view.findViewById(R.id.progress_bar_image); p_Bar.setProgress(Integer.parseInt(values[0])); customAdapter1.notifyDataSetChanged(); } @Override protected void onPostExecute(String result) { // TODO Auto-generated method stub super.onPostExecute(result); } } 

La barra de progreso es la vista de la vista de lista personalizada, quiero actualizarla en el tiempo de ejecución.

Gracias

Inflaste el ProgressBar dentro de la devolución de llamada onProgress. Esto es absolutamente incorrecto. El ProgressBar debe ser agregado a la vista antes de que su AsyncTask se inicie (inflar y agregar) y luego a su vez para ser visibile en su AsyncTask constructor. También debe almacenar una referencia a ProgressBar en AsyncTask (o de alguna otra forma en el ámbito de la clase interna no estática).

Al final, su AsyncTask debería tener este aspecto (suponiendo que el ProgressBar ya está conectado a la vista):

 class SendPhotoToFriend extends AsyncTask<String, String, String> { String receiver,path = ""; ProgressBar progress; public SendPhotoToFriend(String path, String receiver, ProgressBar progress) { this.path = path; this.receiver = receiver; this.progress = progress; this.progress.setVisibility(View.Visible); } @Override protected String doInBackground(String... arg0) { // You're application logic... // ... publishProgress((int)((total*100)/transfer.getFileSize())); // ... } @Override protected void onProgressUpdate(final Integer... values) { this.progress.setProgress(values[0]); } } 

También usted no necesita (y no debe) llamar a adapter.notifiyDataSetChanged() en su onProgres-Callback.

Supongo que cada vista de elemento de lista tiene una barra de progreso, si ese es el caso, puede utilizar getView para obtener la vista para esa posición y, a continuación, llame al:

  View view = customAdapter1.getView(position, convertView, parent); ProgressBar p_Bar = (ProgressBar)view.findViewById(R.id.progress_bar_image); p_Bar.setProgress(Integer.parseInt(values[0])); 

No es necesario llamar a customAdapter1.notifyDataSetChanged ();

  • Android: establecer el color de forma programada a ProgressBar
  • Cómo implementar indicador de progreso circular alrededor de un botón?
  • Cómo cambiar el color predeterminado del círculo ProgressBar en Android
  • La animación del hilador personalizado no es lo suficientemente suave: framesCount y error frameDuration
  • Barra de progreso de la actualización en listview para archivos múltiples descarga
  • Barra de progreso Android DialogFragment
  • Cambiando el color de fondo translúcido de la barra de progreso android
  • ProgressBar no anima mientras infla viewstub
  • Android: Barra de progreso de Semi Circle
  • Vista web de Android Timeout si tarda más de un cierto tiempo en cargar
  • ¿Cómo puedo mostrar un ProgressBar sólo después de un retardo mínimo?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.