2015-03-19 75 views
3

我有一個SeekBar在我的ListView項目。併爲每個項目的歌曲。當播放歌曲時,我想SeekBar更新和或控制MediaPlayerSeekBar進步。 到目前爲止,我已經使它只能控制,通過拖動拇指來設置MediaPlayer進度。問題是,我無法讓它更新SeekBar Thumb位置。SeekBar沒有更新Android

這是我的代碼:

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

和finaly代碼更新搜索欄

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

搜索欄

<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> 
+0

'handler.postDelayed(updateTimeProgressBar,1000);'只在1000ms後執行一次,所以進度條會被更新一次。爲什麼不創建一個每秒運行一次的「計時器」來更新進度條? – 2015-03-19 12:25:35

+0

實際上這是工作,我認爲它沒有工作,它只被調用一次,所以我添加了日誌,並按預期工作,每1秒更新seekbar進度。但是seekbar不動,沒有任何事情發生 – 2015-03-19 14:15:19

+0

另外,'處理程序。postDelayed(這個,1000);'跑一次。您可以創建此「處理程序」,以便每秒運行一次。 – 2015-03-19 14:49:34

回答

2

問題在於,錯誤的SeekBar正在更新。因此,只需在clickListener內添加SeekBar聽衆和runnable即可使用。同時擴展基礎適配器並獲取物品ID。

2

這是我的實施和它爲我工作:

某處在你的代碼添加此(每首歌曲一次):

_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; 
} 
+0

它不工作,'updateSeekbarView'方法被調用,但'SeekBar'沒有更新。 – 2015-03-21 14:23:11

+0

你可以粘貼包含seekbar的佈局嗎? – kha 2015-03-21 14:34:18

+0

佈局粘貼。我沒有包含所有項目,因爲它非常大。如果有必要,我會粘貼整個佈局 – 2015-03-21 14:45:12

1

在這種情況下,我認爲持有人蔘考被轉儲或更改爲另一個視圖。

您可以通過初始化可運行在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); 

      } 
     } 
    }; 
} 

但我真的需要知道你怎麼玩你的歌能夠進一步幫助ü...

+0

是的,我也這麼認爲,並嘗試通過更新SeekBar裏面的GetView方法,它沒有工作。之後,我在seekbar listener中添加了OnProgressChanged方法的日誌,並且進度正在改變,但是拇指位置沒有更新。所以,可能意味着錯誤的seekbar正在更新?至於其他代碼,我沒有在這臺PC上使用它,如果沒有,我會盡力在明天發佈它,然後是星期一。但播放方法已在上面發佈。 – 2015-03-21 17:07:46