单击其他项目时更新适配器中的项目
Update items in adapter when other item clicked
我陷入了相当简单的事情中。
我有一个 activity 的片段,其中包括 RecyclerView 和带有项目的自定义适配器。
这个activity是关于广播电台的。
所以在我的适配器中,我有几个带有播放停止按钮的项目。当我点击按钮时,会出现“播放”符号。再次点击这些按钮 - 将出现“停止”按钮。这个逻辑可行。
但是如果我要点击其他项目,在其他播放停止按钮上,所有之前点击的项目都会保存不同的状态,所以我想改变之前点击项目的状态 - 只有当前点击的项目具有当前位置不同的播放停止按钮。 如何获取?
我尝试了一些notify...()
方法,但没有得到我想要的结果。 我想我在错误的地方尝试通知适配器。
holder.LLPLayStop.setOnClickListener(v->{
if (isPlay[0] == false) {
isPlay[0] = true;
try {
if (mp != null) {
mp.stop();
mp.release();
}
mp = new MediaPlayer();
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
mp.setDataSource("http://cast.radiogroup.com.ua:8000/avtoradio");
mp.prepareAsync();
// notifyDataSetChanged();
holder.PBLoading.setVisibility(View.VISIBLE);
holder.list_item_play_stop.setVisibility(View.GONE);
mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
public void onPrepared(MediaPlayer mp) {
mp.start();
holder.PBLoading.setVisibility(View.GONE);
holder.list_item_play_stop.setVisibility(View.VISIBLE);
holder.list_item_play_stop.setImageDrawable(mContext.getResources().getDrawable(R.drawable.radio_stop));
}
});
} catch (IOException e) {
Log.e(TAG, "prepare() failed");
}
} else {
isPlay[0] = false;
mp.stop();
mp.release();
mp = null;
// notifyDataSetChanged();
holder.list_item_play_stop.setImageDrawable(mContext.getResources().getDrawable(R.drawable.radio_play));
}
// notifyItemChanged(position);
});
您需要继续播放索引并在每次点击时检查所有行。所以你需要变量来保持点击行,像这样:
在您的适配器中:
private Integer selectedPos = -1;
在 play/stop 按钮的 onClick
中:
{
selectedPos = position;
notifyDataSetChanged(); // notify list , then each row can handle it's state base on selectedPos
}
最后检查 onBindViewHolder
中的播放行:
if(selectedPos == position){ // position is the current row position
//this row is selected for playing...
//do appropriate works
} else{
//this row is not select for play so change button style to normal
}
我陷入了相当简单的事情中。
我有一个 activity 的片段,其中包括 RecyclerView 和带有项目的自定义适配器。 这个activity是关于广播电台的。
所以在我的适配器中,我有几个带有播放停止按钮的项目。当我点击按钮时,会出现“播放”符号。再次点击这些按钮 - 将出现“停止”按钮。这个逻辑可行。
但是如果我要点击其他项目,在其他播放停止按钮上,所有之前点击的项目都会保存不同的状态,所以我想改变之前点击项目的状态 - 只有当前点击的项目具有当前位置不同的播放停止按钮。 如何获取?
我尝试了一些notify...()
方法,但没有得到我想要的结果。 我想我在错误的地方尝试通知适配器。
holder.LLPLayStop.setOnClickListener(v->{
if (isPlay[0] == false) {
isPlay[0] = true;
try {
if (mp != null) {
mp.stop();
mp.release();
}
mp = new MediaPlayer();
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
mp.setDataSource("http://cast.radiogroup.com.ua:8000/avtoradio");
mp.prepareAsync();
// notifyDataSetChanged();
holder.PBLoading.setVisibility(View.VISIBLE);
holder.list_item_play_stop.setVisibility(View.GONE);
mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
public void onPrepared(MediaPlayer mp) {
mp.start();
holder.PBLoading.setVisibility(View.GONE);
holder.list_item_play_stop.setVisibility(View.VISIBLE);
holder.list_item_play_stop.setImageDrawable(mContext.getResources().getDrawable(R.drawable.radio_stop));
}
});
} catch (IOException e) {
Log.e(TAG, "prepare() failed");
}
} else {
isPlay[0] = false;
mp.stop();
mp.release();
mp = null;
// notifyDataSetChanged();
holder.list_item_play_stop.setImageDrawable(mContext.getResources().getDrawable(R.drawable.radio_play));
}
// notifyItemChanged(position);
});
您需要继续播放索引并在每次点击时检查所有行。所以你需要变量来保持点击行,像这样:
在您的适配器中:
private Integer selectedPos = -1;
在 play/stop 按钮的 onClick
中:
{
selectedPos = position;
notifyDataSetChanged(); // notify list , then each row can handle it's state base on selectedPos
}
最后检查 onBindViewHolder
中的播放行:
if(selectedPos == position){ // position is the current row position
//this row is selected for playing...
//do appropriate works
} else{
//this row is not select for play so change button style to normal
}