2015-03-19 95 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