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.
- Horizontal progressbar agregar indicadores de círculo
- ¿Cómo colocar un ProgressBar dentro del ListView?
- Android - no puede poner el pulgar en el centro de una barra de búsqueda
- Cómo rastrear el progreso de una solicitud de volea
- Implementar un indicador de actividad giratoria similar a iOS en Android
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
- Android: cómo deshabilitar los controles durante la barra de progreso está activa
- ¿Cómo puedo cambiar el estilo de un ProgressBar a pequeño?
- HttpUrlConnection carga de archivo multipart con ProgressBar
- Modificación de la imagen de recurso de la barra de progreso
- Animación de carga de línea Android
- Cómo crear barra de progreso de estilo horizontal mediante programación en Android?
- Cómo utilizar la barra de progreso indeterminada en appcompat-v7 r21 biblioteca?
- Círculo de giro de ProgressDialog
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 Java – String .replaceAll para reemplazar caracteres específicos (regex)
- Android límite máximo para geofences?