在自定义列表视图中切换 ImageView 按钮
Posted
技术标签:
【中文标题】在自定义列表视图中切换 ImageView 按钮【英文标题】:Toggle ImageView Button inside custom listview 【发布时间】:2017-07-24 11:09:23 【问题描述】:我有一个铃声列表视图,每个铃声的每一行都有一个播放图像视图..
这是它的视图..
现在显然,当用户单击播放按钮时,它应该切换到暂停按钮。我已经实现了这一点,到目前为止一切都很好:
接口(在适配器中)
public interface PlayPauseClick
void playPauseOnClick(int position);
private PlayPauseClick callback;
public void setPlayPauseClickListener(PlayPauseClick listener)
this.callback = listener;
适配器(在 getView 中)
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);
);
活动
@Override
public void playPauseOnClick(int position)
final Product product = productList.get(position);
if (product.paused)
product.setPlayPauseId(R.drawable.ic_pause);
product.paused=false;
else
product.setPlayPauseId(R.drawable.ic_play);
product.paused = true;
adapter.notifyDataSetChanged();
;
现在我有一个问题:
我不知道如何跟踪当前播放的行,我的意思是如果用户想要播放另一行的歌曲,首先我必须更改当前暂停切换播放,然后播放新的。
你能帮我解决这个问题吗!?
【问题讨论】:
【参考方案1】:经过一番挖掘,我找到了两个答案..
1:我们可以在适配器中存储当前播放歌曲的索引。
所以我们只需要在点击其他按钮时打开暂停。
在适配器中:
int currentPosition = -1;
...
if (callback != null)
callback.playPauseOnClick(position);
if (currentPosition == -1)
currentPosition = position;
else if (currentPosition == position)
currentPosition = -1;
else if (currentPosition != -1 && currentPosition != position)
callback.playPauseOnClick(currentPosition);
currentPosition = position;
2:为每个listview数据项设置资源
内部回调或任何地方都可以获取listview数据:
@Override
public void playPauseOnClick(int position)
final Product product = productList.get(position);
if (product.paused)
for(int i=0;i< productList.size();i++)
movieList.get(i).setPlayPauseId(R.drawable.ic_play);
movieList.get(i).paused = true;
product.setPlayPauseId(R.drawable.ic_pause);
product.paused=false;
else
product.setPlayPauseId(R.drawable.ic_play);
product.paused = true;
adapter.notifyDataSetChanged();
【讨论】:
【参考方案2】:你可以这样做 首先,声明一个全局变量
int lastposition=null;
然后
@Override
public void playPauseOnClick(int position)
final Product product = productList.get(position);
if(lastposition!=null)
Product previous = productList.get(lastposition);
previous.setPlayPauseId(R.drawable.ic_pause);
previous.paused=false;
lastposition=position;
else lastposition=position;
if (product.paused)
//new loadSingleView().execute(product.image_url);
//Log.d(LOG, product.image_url);
product.setPlayPauseId(R.drawable.ic_pause);
product.paused=false;
else
product.setPlayPauseId(R.drawable.ic_play);
product.paused = true;
adapter.notifyDataSetChanged();
;
将以上代码替换为您的活动中的代码
【讨论】:
【参考方案3】:您可以保存一个变量“mCurrentPosition”来保存当前播放的曲目。
然后创建两个单独的方法,一个用于播放,一个用于暂停。只需暂停当前曲目并播放被点击的曲目。
记住在播放新曲目时也要设置当前位置。
类似这样的:
@Override
public void onClick(View v)
if (callback != null)
callback.pause(mCurrentPosition);
mCurrentPosition = position;
callback.play(position);
您可能需要稍微调整一下,因为我不知道您是如何设置“回调”或“位置”来自哪里的。我假设像“getAdapterPosition()”这样的东西。但希望你能通过这个例子看到如何做到这一点。如果没有请评论。
编辑以回应更新的问题:
对于界面做这样的事情:
public interface PlayPauseClick
void pause(int position);
void play(int position);
编辑2:
@Override
void pause(int position)
if(position != null)
Product product = productList.get(position);
product.setPlayPauseId(R.drawable.ic_play);
product.paused = true;
adapter.notifyDataSetChanged();
@Override
void play(int position)
// Homework exercise.
【讨论】:
这是写答案。 我已经更新了我的问题..你能解释一下我应该在我的播放和暂停方法中进行哪些更改(如何将它们分开).. 我的意思是改变我原来的 playPauseOnClick 方法..关于条件等等.. 好的,怎么样?现在事情清楚了吗?它可能对您的代码不完全正确,但您现在知道该怎么做吗? 我了解你的解决方案是如何工作的,但事情并没有在那里加起来,但我正在努力。我让你知道,谢谢以上是关于在自定义列表视图中切换 ImageView 按钮的主要内容,如果未能解决你的问题,请参考以下文章