这可能已经被问过很多次但是我似乎无法得到实际答案。我有一个适配器,它从API获取数据并将其转换为列表视图。该行中有自己的播放按钮。单击行内的播放按钮时,应将按钮更改为暂停按钮。当我点击不同行的播放按钮时,单击的最后一个按钮应该返回播放按钮。我知道它是按钮上的setimageresource但我似乎无法跟踪我点击的最后一个按钮。这是我的代码:
这是适配器和
的一部分 @Override
public View getView(final int pos, View ConvertView, ViewGroup parent) {
final MyViewHolder holder;
if (ConvertView == null){
ConvertView = layoutinflater.inflate(R.layout.row, parent, false);
holder = new MyViewHolder();
holder.plays = (ImageButton) ConvertView.findViewById(R.id.plays);
holder.plays.setFocusable(false);
play = playdata.get(pos);
holder.posturl= play.getposturl();
mStartPlaying = true;
player = new MediaPlayer();
// player.setOnCompletionListener(onCompletion);
// player.setOnErrorListener(onError);
holder.plays.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
String url = holder.posturl;
if (!mStartPlaying){
holder.plays.setImageResource(R.drawable.ic_action_stop);
startPlaying(url);
mStartPlaying = true;
} else{
holder.plays.setImageResource(R.drawable.ic_action_play);
player.stop();
mStartPlaying = false;
}
}
private void startPlaying(String url) {
// TODO Auto-generated method stub
try {
player.reset();
player.setDataSource(url);
// mPlayer.setDataSource(mFileName);
player.prepareAsync();
player.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
player.start();
}
});
} catch (IOException e) {
Log.e("preparefailed", "prepare() failed");
}
}
});
if (!player.isPlaying()){
holder.plays.setImageResource(R.drawable.ic_action_play);
}
ConvertView.setTag(holder);
ConvertView.setOnClickListener(new OnClickListener() {
public void onClick(View v){
Log.d("hi", "hi from "+ pos);
}
});
}
else{
holder = (MyViewHolder)ConvertView.getTag();
}
play = playdata.get(pos);
holder.play = play;
return ConvertView;
}
这是我的主要活动:
mLastClickedPosition = -1;
this.PlayList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick (AdapterView<?> parent, View view, int position, long id) {
if(mLastClickedPosition != -1){
// do something to pause the item in your list at this position
}
// next, update mLastClickedPosition
mLastClickedPosition = position;
if(position==0){
ImageView imageView = (ImageView) view.findViewById(R.id.plays);
imageView.setImageResource(R.drawable.ic_action_stop);
}
// play audio
}
});
媒体播放器在适配器中初始化,我不确定如何在主活动中初始化它。任何帮助表示赞赏!先谢谢!
答案 0 :(得分:1)
如果ListView中的每一行都知道它所处的状态(butten),您可以使用侦听器或ListView
控制LocalBroadcastManager
中的每一行。试试this。这是一个ListView
骨架,开始在OOP中思考,每一行真正成为一个可以知道它处于什么状态的对象。 ListView抽象示例,使您更容易理解/将java代码视为对象。
从上面的例子中,假设创建的每一行(EventItem
)都是LocalBroadcastManager
的监听器或寄存器。然后,很容易解决每一行。与每一行交谈并要求它停止让按钮处于暂停状态,或任何
...我正在更新此答案,因为上面的链接不起作用。这是gethub项目的新链接
答案 1 :(得分:0)
您应该遵循Erik的建议,并将处理委托给每一行。
顺便说一句,问题可能是因为你有两个听众?您正在维持主要活动中的状态,甚至可能不会被调用。如果没有发生这种情况,您可能需要将维护状态移动到列表侦听器(保存最后一个位置)。但是,请遵循Erik的建议,这应该可以帮助您轻松调试和维护。
祝你好运。