SeekBar не обновляет Android

У меня есть элемент SeekBar в SeekBar ListView . И песня для каждого элемента. Когда песня воспроизводится, я хочу, чтобы SeekBar обновлял и контролировал программы MediaPlayer с помощью SeekBar . До сих пор я делал это только для контроля, перетаскивая большой палец, чтобы установить прогресс MediaPlayer . Проблема в том, что я не могу заставить его обновить позицию SeekBar Thumb.

Это мой код:

  Ids holder; private final Utils utils = new Utils(); private final Handler handler = new Handler(); long totalDuration; long currentPosition; 

 holder.seekbar.setMax(100); holder.seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) { handler.removeCallbacks(updateTimeProgressBar); int fullDuration = Item.mp.getDuration(); int currentPosition = utils.progressToTimer( seekBar.getProgress(), fullDuration); Item.mp.seekTo(currentPosition); updateProgressBar(); } @Override public void onStartTrackingTouch(SeekBar seekBar) { handler.removeCallbacks(updateTimeProgressBar); } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { } }); holder.seekbar.setFocusable(true); holder.seekbar.setEnabled(true); holder.seekbar.setTag(position); 

… играющий файл

 Item.mp = MediaPlayer.create(context, Integer.valueOf(this.songPos[songPosInt]).intValue()); Item.mp.start(); holder.seekbar.setProgress(0); updateProgressBar(); 

И окончательный код для обновления SeekBar

 public void updateProgressBar() { handler.postDelayed(updateTimeProgressBar, 1000); } private final Runnable updateTimeProgressBar = new Runnable() { @Override public void run() { if (Item.isPlaying == true && pausedSamePos == false) { currentPosition = Item.mp.getCurrentPosition(); totalDuration = mp.getDuration(); int currentTime = (utils.getProgressPercentage(totalDuration, currentPosition)); holder.seekbar.setProgress(currentTime); Log.i("CALLED", "SHOULD BE UPDATED " + currentPosition + "of total" + totalDuration); handler.postDelayed(this, 1000); } } }; 

Utils – это простой вспомогательный класс для преобразования MS в SEC. Я также пробовал

 int totalDuration=mp.getDuration() /1000; holder.seekbar.setMax(totalduration); .. int currentPosition=mp.getCurrentPosition()/1000; holder.seekbar.setProgress(currentPosition); 

SeekBar

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/main_frame3" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" android:orientation="horizontal" > <SeekBar android:id="@+id/seekbar" android:layout_width="0.0dip" android:layout_height="wrap_content" android:layout_weight="1.0" android:paddingLeft="5.0dip" android:paddingRight="5.0dip" android:progressDrawable="@drawable/seekbar_line" android:thumb="@drawable/seekbar_thumb" /> <TextView android:id="@+id/textview_duration_sb" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingRight="10.0dip" android:text="00:05" android:textAppearance="?android:textAppearanceSmall" android:textColor="#8C000000" /> </LinearLayout> 

И в моем представлении ListView

  <FrameLayout android:id="@+id/main_frame2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="5.0dip" > <TextView android:id="@+id/textview_duration" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:focusable="false" android:text="00:05" android:textColor="#8C000000" android:textSize="14.0sp" /> <include layout="@layout/play_item" /> </FrameLayout> 

Это моя реализация, и она работает для меня:

Где-то в вашем коде добавьте это (один раз за песню):

 _seekBar.setProgress(0); _seekBar.setMax(_mediaPlayer.getDuration() / 1000); 

А затем обновите строку поиска с помощью этого кода:

 private Runnable _updateRunnable = new Runnable() { public void run() { if (_hasStopped) { return; } updateSeekbarView(); } }; private synchronized void updateSeekbarView() { if (_hasStopped) { reset(); return; } if (_mediaPlayer == null) { return; } if (!_mediaPlayer.isPlaying()) { stop(); return; } long totalDuration = _mediaPlayer.getDuration(); long currentDuration = _mediaPlayer.getCurrentPosition(); _txtMax.setText("" + AudioUtils.milliSecondsToTimer(totalDuration)); _txtCurrent.setText("" + AudioUtils.milliSecondsToTimer(currentDuration)); _seekBar.setProgress((int) (currentDuration / 1000)); _handler.postDelayed(_updateRunnable, 1000); } 

И реализация AudioUtils.milliSecondsToTimer() в случае, если вы хотите показать таймер в виде текста рядом со стрелкой:

 public static String milliSecondsToTimer(long milliseconds) { String finalTimerString = ""; String secondsString = ""; // Convert total duration into time int hours = (int) (milliseconds / (1000 * 60 * 60)); int minutes = (int) (milliseconds % (1000 * 60 * 60)) / (1000 * 60); int seconds = (int) ((milliseconds % (1000 * 60 * 60)) % (1000 * 60) / 1000); // Add hours if there if (hours > 0) { finalTimerString = hours + ":"; } // Prepending 0 to seconds if it is one digit if (seconds < 10) { secondsString = "0" + seconds; } else { secondsString = "" + seconds; } finalTimerString = finalTimerString + minutes + ":" + secondsString; // return timer string return finalTimerString; } 

Проблема в том, что SeekBar . Так что просто добавьте слушателя SeekBar и runnable внутри clickListener и он будет работать. Также расширьте базовый адаптер и получите идентификатор элемента.

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

Вы можете решить эту проблему, инициализируя Runnable в методе getView следующим образом:

 View getView(){ ... updateTimeProgressBar = new Runnable() { Ids holderCopy = holder; @Override public void run() { if (Item.isPlaying == true && pausedSamePos == false) { currentPosition = Item.mp.getCurrentPosition(); totalDuration = mp.getDuration(); int currentTime = (utils.getProgressPercentage(totalDuration, currentPosition)); holderCopy.seekbar.setProgress(currentTime); Log.i("CALLED", "SHOULD BE UPDATED " + currentPosition + "of total" + totalDuration); handler.postDelayed(this, 1000); } } }; } 

Но мне действительно нужно знать, как вы играете в свою песню, чтобы еще больше помочь …