ImageView 按钮在列表视图中切换
ImageView Button Toggle inside listview
我有一个铃声列表视图,每个铃声的每一行都有一个播放图像视图。
这是对它的看法。
现在很明显,当用户点击播放按钮时,它应该切换到暂停按钮。
现在我有一个问题:
我点击一个播放按钮,它会变成暂停按钮,但同时当我点击另一行的播放按钮时,需要点击两次,直到第二次变成暂停按钮。
这是我的代码:
适配器
Product product = (Product) mDataItems.get(position);
holder.playPause=(ImageView)v.findViewById(R.id.playPause);
holder.playPause.setImageResource(product.getPlayPauseId());
holder.playPause.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (callback != null) {
callback.playPauseOnClick(position);
}
}
});
Activity
@Override
public void playPauseOnClick(int position) {
final Product product = productList.get(position);
if (paused) {
product.setPlayPauseId(R.drawable.ic_pause);
paused=false;
}else {
product.setPlayPauseId(R.drawable.ic_play);
paused = true;
}
adapter.notifyDataSetChanged();
};
我已经猜到问题出在我的情况下
if(paused){
}
如果你能给我一个更好的逻辑,我将不胜感激
您正在为所有行使用一个 pause
字段,因此第一次点击将其状态更改为 true
,第二次点击另一行将其更改为 false
并且集合可绘制对象
product.setPlayPauseId(R.drawable.ic_pause)
在第一行和第三次点击工作正常。
您可以为每个 product
定义 pause
字段,并在 if 子句中检查产品暂停字段
if(product.pause){
...
product.paused = false;
}else{
product.paused = true;
}
这是一个更简单的案例,我所做的是我在 RecyclerView 中从 url 流式传输音频铃声 .. 将 class 变量设为
private int oldPosition = -1; ,使用此变量,您将跟踪 RecyclerView
中当前正在播放音频的行
@Override
public void onRecyclerViewChildItemClick(BaseRecyclerViewHolder holder, int resourceId) {
super.onRecyclerViewChildItemClick(holder, resourceId);
switch (resourceId) {
case R.id.media_play_container:
int position = holder.getAdapterPosition();
if (oldPosition != -1)
resetResources();
if (oldPosition == position) {
resetResources();
oldPosition = -1;
return;
}
updateViewAtPosition(false, false); // update old selected view
oldPosition = position; // update position
BaseRecyclerViewAdapter adapter = (BaseRecyclerViewAdapter) getRecyclerView().getAdapter();
AudioItem item = (AudioItem) adapter.getItemAt(oldPosition);
String url = item.getAudioPreviewUrl();
// if url is valid show progress and play
if (AppUtils.ifNotNullEmpty(url)) {
updateViewAtPosition(true, false);
playRingtone(url);
}
break;
case R.id.iv_media_favorite:
break;
}
}
此方法更新正在播放的旧行
updateViewAtPosition(false, false);
private void updateViewAtPosition(boolean isLoading, boolean isPlaying) {
RecyclerView recyclerView = getRecyclerView();
if (recyclerView == null || oldPosition == -1)
return;
BaseRecyclerViewAdapter adapter = (BaseRecyclerViewAdapter) recyclerView.getAdapter();
if (adapter == null)
return;
AudioItem item = (AudioItem) adapter.getItemAt(oldPosition);
item.setPlaying(isPlaying);
item.setLoading(isLoading);
adapter.update(oldPosition, item);
adapter.notifyItemChanged(oldPosition);
}
// 重置媒体播放器
重置资源();
private void resetResources() {
resetMediaPlayer();
resetViewResources();
}
private void resetMediaPlayer() {
try {
if (mediaPlayer != null) {
if (mediaPlayer.isPlaying())
mediaPlayer.stop();
mediaPlayer.reset();
}
} catch (Exception e) {
Logger.caughtException(e);
}
}
private void resetViewResources() {
if (oldPosition == -1)
return;
updateViewAtPosition(false, false);
}
我有一个铃声列表视图,每个铃声的每一行都有一个播放图像视图。
这是对它的看法。
现在很明显,当用户点击播放按钮时,它应该切换到暂停按钮。
现在我有一个问题:
我点击一个播放按钮,它会变成暂停按钮,但同时当我点击另一行的播放按钮时,需要点击两次,直到第二次变成暂停按钮。
这是我的代码:
适配器
Product product = (Product) mDataItems.get(position);
holder.playPause=(ImageView)v.findViewById(R.id.playPause);
holder.playPause.setImageResource(product.getPlayPauseId());
holder.playPause.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (callback != null) {
callback.playPauseOnClick(position);
}
}
});
Activity
@Override
public void playPauseOnClick(int position) {
final Product product = productList.get(position);
if (paused) {
product.setPlayPauseId(R.drawable.ic_pause);
paused=false;
}else {
product.setPlayPauseId(R.drawable.ic_play);
paused = true;
}
adapter.notifyDataSetChanged();
};
我已经猜到问题出在我的情况下
if(paused){
}
如果你能给我一个更好的逻辑,我将不胜感激
您正在为所有行使用一个 pause
字段,因此第一次点击将其状态更改为 true
,第二次点击另一行将其更改为 false
并且集合可绘制对象
product.setPlayPauseId(R.drawable.ic_pause)
在第一行和第三次点击工作正常。
您可以为每个 product
定义 pause
字段,并在 if 子句中检查产品暂停字段
if(product.pause){
...
product.paused = false;
}else{
product.paused = true;
}
这是一个更简单的案例,我所做的是我在 RecyclerView 中从 url 流式传输音频铃声 .. 将 class 变量设为 private int oldPosition = -1; ,使用此变量,您将跟踪 RecyclerView
中当前正在播放音频的行 @Override
public void onRecyclerViewChildItemClick(BaseRecyclerViewHolder holder, int resourceId) {
super.onRecyclerViewChildItemClick(holder, resourceId);
switch (resourceId) {
case R.id.media_play_container:
int position = holder.getAdapterPosition();
if (oldPosition != -1)
resetResources();
if (oldPosition == position) {
resetResources();
oldPosition = -1;
return;
}
updateViewAtPosition(false, false); // update old selected view
oldPosition = position; // update position
BaseRecyclerViewAdapter adapter = (BaseRecyclerViewAdapter) getRecyclerView().getAdapter();
AudioItem item = (AudioItem) adapter.getItemAt(oldPosition);
String url = item.getAudioPreviewUrl();
// if url is valid show progress and play
if (AppUtils.ifNotNullEmpty(url)) {
updateViewAtPosition(true, false);
playRingtone(url);
}
break;
case R.id.iv_media_favorite:
break;
}
}
此方法更新正在播放的旧行 updateViewAtPosition(false, false);
private void updateViewAtPosition(boolean isLoading, boolean isPlaying) {
RecyclerView recyclerView = getRecyclerView();
if (recyclerView == null || oldPosition == -1)
return;
BaseRecyclerViewAdapter adapter = (BaseRecyclerViewAdapter) recyclerView.getAdapter();
if (adapter == null)
return;
AudioItem item = (AudioItem) adapter.getItemAt(oldPosition);
item.setPlaying(isPlaying);
item.setLoading(isLoading);
adapter.update(oldPosition, item);
adapter.notifyItemChanged(oldPosition);
}
// 重置媒体播放器 重置资源();
private void resetResources() {
resetMediaPlayer();
resetViewResources();
}
private void resetMediaPlayer() {
try {
if (mediaPlayer != null) {
if (mediaPlayer.isPlaying())
mediaPlayer.stop();
mediaPlayer.reset();
}
} catch (Exception e) {
Logger.caughtException(e);
}
}
private void resetViewResources() {
if (oldPosition == -1)
return;
updateViewAtPosition(false, false);
}