Аудио Воспроизведение из URI Inside Listview, но Seekbar не обновляется в элементе списка ListView

  • Я играю аудио от Uri, его работающе хорошо.
  • Нажатие кнопки из каждого элемента списка.

Проблема: Воспроизведение аудио в Listview, но Seekbar не перемещается (Обновление).

EDIT: 1

1. Аудио воспроизводится в каждом элементе Listview Perfectly, Но Seekbar не работает (не обновляется).

Пожалуйста, помогите мне решить эту проблему.

Мой Адаптер массива Listview Array Класс:

Adapter.class

     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);

    }

Ответ 1

вам нужно обновлять позицию (значение) в поисковой строке каждую секунду.

Чтобы установить максимальную скорость поиска...

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

и обновлять его каждую секунду, чтобы показать прогресс

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

Ответ 2

Смотрите это:

 seek_bar_view.setProgress(player.getCurrentPosition()); 

здесь player.getCurrentPosition() возвращает время в миллисе, вам нужно преобразовать его в int, а затем установить прогресс в seekBar.

Попробуйте следующее:

 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();
}

и теперь получите процент для вашего SeekBar следующим образом:

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

seek_bar_view.setProgress(currentProgress); 

Отредактировано:

В вашем конкретном случае внутри элемента ListView:

Вам нужно будет уведомить адаптер каждый раз, когда вы измените положение стрелки. Для этого самым простым подходом было бы взять переменную внутри класса POJO, который вы используете для установки адаптера.

Внутри класса POJO

   int progress=0;

В вашем адаптере установите скорость поиска.

   seekbar.setProgress(progress);

В вашем адаптере измените значение прогресса и notifyadapter

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

//Re-Edited:

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();

}        
});