在自定义列表视图中切换 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 按钮的主要内容,如果未能解决你的问题,请参考以下文章

在自定义适配器的列表视图项中加载不同的图像

如何快速在自定义导航栏顶部制作一半的 ImageView

在列表视图中查找 Imageview 的位置

如何在自定义适配器上实现 onClickListener?

排序JSONArray后,自定义列表视图没有改变?

在列表视图中查找按钮的位置