2017-03-04 212 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();  
    }; 

的代碼替換上面的代碼在你的活動