2017-03-04 185 views
0

我有每一行的每个铃声在表演图像视图的铃声列表视图中切换的ImageView按钮..自定义列表视图

这是它的观点..

This is the view of it

现在很明显,当用户点击播放按钮就应该切换到暂停按钮。我已经实现了这一点,这一切都很好,到目前为止:

接口(在适配器)

 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数据:

@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(); 
} 
0

您可以持有一个变量“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); 
} 

EDIT2

@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. 
} 
+1

这是写答案。 – Wizard

+0

我已经更新了我的问题。请问您可以详细解释我应该在播放和暂停方法中进行哪些更改(如何区分它们)。 –

+0

在界面中添加第二种方法。我会更新答案... –

0

你可以这样做 第一,声明一个全局变量

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();  
    }; 

的代码替换上面的代码在你的活动