【发布时间】:2026-01-03 23:25:02
【问题描述】:
我有一个带有自定义列表项的 ListView,每个列表项中有一个按钮和一个 SeekBar。现在,当单击按钮时,音频开始播放,我想为单击按钮的位置设置 SeekBar 的进度。使用我拥有的代码,正确的 SeekBar 开始移动,但是当我上下滚动几次时,另一个 SeekBar 开始移动。我已经尝试了很多东西,这是我的最后一个:
import android.app.Activity;
import android.content.Context;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Handler;
import android.support.annotation.LayoutRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageButton;
import android.widget.SeekBar;
import android.widget.TextView;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
public class MyListAdapter extends ArrayAdapter<Audio> {
ArrayList<Audio> audios;
Context context;
int resource;
private static MediaPlayer mediaPlayer;
public Handler mHandler = new Handler();
TextView totalTime;
TextView playingTime;
private MyListAdapter(@NonNull Context context, @LayoutRes int resource, @NonNull ArrayList<Audio> audios) {
super(context, resource, audios);
Collections.reverse(audios);
this.audios = audios;
this. context = context;
this.resource = resource;
}
@NonNull
@Override
public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) {
final ViewHolder viewHolder;
View row;
if (convertView == null) {
LayoutInflater layoutInflater = (LayoutInflater) getContext().getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
row = layoutInflater.inflate(R.layout.audio_cell, parent, false);
viewHolder = new ViewHolder();
viewHolder.playButton = (ImageButton) row.findViewById(R.id.playButton);
viewHolder.seekBar = (SeekBar) row.findViewById(R.id.seekBar);
viewHolder.playButton.setTag(position);
viewHolder.seekBar.setTag(position);
row.setTag(viewHolder);
} else {
row = convertView;
viewHolder = (ViewHolder) row.getTag();
}
viewHolder.seekBar.setProgress(0);
//I get the audio url here
final Audio audio = getItem(position);
assert audio != null;
String theURL = audio.getURL();
//Button Click
viewHolder.playButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//here I call the method to play the audio and after that I want
//to update the SeekBar
playAudio(theURL);
updateSeekBar(viewHolder.seekBar);
}
});
return row;
}
private void updateSeekBar(final SeekBar sb) {
Runnable mUpdateTimeTask = new Runnable() {
@Override
public void run() {
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
int mCurrentPosition = mediaPlayer.getCurrentPosition() / 1000;
mHandler.postDelayed(this, 100);
sb.setProgress(mCurrentPosition);
}
}
};
mHandler.postDelayed(mUpdateTimeTask, 100);
}
}
这是我的 ViewHolder 类:
public class ViewHolder {
public ImageButton playButton;
public SeekBar seekBar;
}
现在正如我所说,我尝试了很多东西,但似乎没有任何效果,我想我尝试过的东西都是一样的,因为我每次都得到相同的结果。只要我上下滚动几次,它就会在不同的 SeekBar 上设置进度。任何帮助表示赞赏!
【问题讨论】:
-
为什么不在适配器中使用开始按钮?
-
适配器中有音频路径吗?
-
将搜索栏添加到音频开始
-
@EnamulHaque 是的音频路径在适配器中。我用更多细节更新了答案。而且我不明白“将搜索栏添加到音频开始”,这是什么意思?
-
好的。会给适配器吗?请检查
标签: java android listview seekbar listitem