Reproducción de audio desde URI Dentro de ListView, pero Seekbar no se está actualizando en el elemento ListView de Android

  1. Estoy tocando un audio de Uri Su trabajo bien.
  2. Haga clic en un botón de cada elemento de vista de lista.

Problema: El audio está reproduciendo en el Listview , pero todavía Seekbar no está moviendo (que pone al día ).

EDIT: 1

1. El audio está jugando en cada artículo de Listview perfectamente , pero Seekbar no está trabajando (no que se está actualizando) .

Por favor ayúdenme a resolver este problema.

Mi Listview Array adaptador Clase:

Clase adaptador

private static final int UPDATE_FREQUENCY = 500; int progress=0; public View getView(final int position, View view, ViewGroup parent) { LayoutInflater inflater = context.getLayoutInflater(); View rowView = inflater.inflate(R.layout.audio_listview, null, true); ListenAUdioButton = (Button) rowView.findViewById(R.id.ListenAudiobuttonxml); seek_bar_view = (SeekBar) rowView.findViewById(R.id.seek_bar); ListenAUdioButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // text_shown.setText("Playing..."); try { try { // get Internet status isInternetPresent = cd1.isConnectingToInternet(); // check for Internet status if (isInternetPresent) { if (!itemname3_AUDIO_FILE[position].equals("") || !itemname3_AUDIO_FILE[position].equals("null")) { System.out.println(" AUDIO FILE :-)" + itemname3_AUDIO_FILE[position]); player = new MediaPlayer(); player.setAudioStreamType(AudioManager.STREAM_MUSIC); player.setDataSource(context, Uri.parse(itemname3_AUDIO_FILE[position])); player.prepareAsync(); player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { try { mp.start(); seek_bar_view.setMax(player.getDuration()); updatePosition(); } catch (Exception e) { e.printStackTrace(); } } }); player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { stopPlay(); } }); MediaPlayer.OnErrorListener onError = new MediaPlayer.OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { // returning false will call the OnCompletionListener return false; } }; } else { Toast.makeText(getContext(), "Audio Not Found..!", Toast.LENGTH_SHORT).show(); } } else { Toast.makeText(getContext(), "Please Check Your Internet Connection..!", Toast.LENGTH_SHORT).show(); } } catch (Exception e) { e.printStackTrace(); Toast.makeText(getContext(), "Audio Not Found..!", Toast.LENGTH_SHORT).show(); } } catch (Exception e) { e.printStackTrace(); } } }); return rowView; } private void stopPlay() { player.stop(); player.reset(); // playButton.setImageResource(android.R.drawable.ic_media_play); handler.removeCallbacks(updatePositionRunnable); seek_bar_view.setProgress(0); // isStarted = false; } private final Handler handler = new Handler(); private final Runnable updatePositionRunnable = new Runnable() { public void run() { updatePosition(); } }; private void updatePosition() { handler.removeCallbacks(updatePositionRunnable); seek_bar_view.setProgress(progress); progress=getProgressPercentage(player.getCurrentPosition(),player.getDuration(); notifyDataSetChanged(); handler.postDelayed(updatePositionRunnable, UPDATE_FREQUENCY); } 

Usted necesita actualizar su posición de seekbar (valor) en cada segundo.

Para establecer el valor máximo de búsqueda.

 seek_bar_view.setMax((int) player.getDuration()); 

Y actualizar cada segundo para mostrar el progreso

 Handler mHandler = new Handler(); runOnUiThread(new Runnable() { @Override public void run() { seek_bar_view.setProgress((int) player.getCurrentPosition()); } mHandler.postDelayed(this,1000); } ); 

Mira esto:

  seek_bar_view.setProgress(player.getCurrentPosition()); 

Aquí player.getCurrentPosition () devuelve el tiempo en millis, necesita convertirlo a int y luego establecer el progreso a seekBar.

Prueba esto:

  public static int getProgressPercentage(long currentDuration, long totalDuration){ Double percentage = (double) 0; long currentSeconds = (int) (currentDuration / 1000); long totalSeconds = (int) (totalDuration / 1000); // calculating percentage percentage =(((double)currentSeconds)/totalSeconds)*100; // return percentage return percentage.intValue(); } 

Y ahora consigue el porcentaje para su SeekBar como esto:

 int currentProgress=getProgressPercentage(player.getCurrentPosition(), player.getDuration()); seek_bar_view.setProgress(currentProgress); 

Editado:

Para su caso específico, dentro de un elemento ListView:

Deberá notificar al adaptador cada vez que cambie la posición de la barra de búsqueda. Para ello, el enfoque más sencillo sería tomar una variable dentro de la clase POJO que está utilizando para configurar el adaptador.

Dentro de tu clase POJO

  int progress=0; 

En su adaptador, defina el progreso de la barra de búsqueda

  seekbar.setProgress(progress); 

En su adaptador, cambie el valor del progreso y notifyadapter

  progress=getProgressPercentage(player.getCurrentPosition(), player.getDuration()); notifyDataSetChanged() 

// Reeditado:

 seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub } @Override public void onStartTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub } @Override public void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) { // TODO Auto-generated method stub notifyDataSetChanged(); } }); 
  • ¿Por qué llamar a setBackgroundColor en una vista rompe su cambio de color de clic largo y resaltado?
  • SearchView en ListView con un adaptador personalizado
  • Refrescante adaptador al tirar de ListView en android
  • Excepción OutOfMemory aparece mientras se desplaza la lista de imágenes
  • Utilice tanto onClickListener como onLongClickListener en listview Android 1.6
  • Android requestFocusFromTouch muestra menú con el primer elemento resaltado
  • Carga perezosa de SQLite
  • Ocultar y mostrar el botón flotante mientras que los rollos de ListView
  • Menú de tipo ListView anidado de forma arbitraria de Android
  • Vaciar ListView dentro de ScrollView como dos Fragmentos
  • Desplazar una Galería activa el estado presionado y elimina el escucha de clics de los sub-elementos
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.