2014-01-15 155 views
1

現狀:的MediaPlayer播放/ ListView中停止

我有了一對夫婦元素和這些元素的自定義列表視圖的應用程序有一個播放按鈕來播放相應的媒體。本身就很好。 我決定,停止播放剪輯可能是一個好主意,所以我爲每個列表視圖項目添加了一個「停止」按鈕,但設置了GONE的可見性,直到播放某些東西。

代碼:

 ImageButton bplay = (ImageButton) itemView.findViewById(R.id.item_bplay); 
     bplay.setTag(currentClip.getFile()); 
     bplay.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       finalItemView.findViewById(R.id.item_bplay).setVisibility(View.GONE); 
       finalItemView.findViewById(R.id.item_bstop).setVisibility(View.VISIBLE); 
       mp.release(); 
       mp = MediaPlayer.create(getApplicationContext(), currentClip.getFile()); 
       mp.start(); 
       mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 

        @Override 
        public void onCompletion(MediaPlayer mp) { 
         finalItemView.findViewById(R.id.item_bplay).setVisibility(View.VISIBLE); 
         finalItemView.findViewById(R.id.item_bstop).setVisibility(View.GONE); 
        } 

       }); 
      } 
     }); 

     ImageButton bstop = (ImageButton) itemView.findViewById(R.id.item_bstop); 
     bstop.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       mp.release(); 
       finalItemView.findViewById(R.id.item_bplay).setVisibility(View.VISIBLE); 
       finalItemView.findViewById(R.id.item_bstop).setVisibility(View.GONE); 
      } 
     }); 

描述:

這工作得很好,只要用戶集中於只有一個剪輯。播放按鈕被替換爲停止按鈕,停止按鈕停止剪輯,或者如果讓剪輯用完,按鈕也會切換回來。

問題:

如果用戶決定通過點擊列表中的第二個元素上播放播放中斷,第一個將卡住了停止按鈕。由於停止按鈕只是執行mp.release(),因此第一個元素的停止按鈕現在能夠停止播放第二個剪輯。 因爲這一切都發生在一個列表視圖中,當第二個項目被點擊時,我不再有權訪問第一個來重新替換按鈕。 我尋找一種方法來捕獲中斷(很像mp.setOnCompletionListener尋找成功完成)並重置按鈕,但到目前爲止,我無法提出任何事情。 我其實喜歡這樣一個事實,通過先放置發佈,然後創建一個新的mediaplayer然後啓動它,用戶可以通過在另一個剪輯上按下Play來快速切換剪輯。我只想讓原始剪輯上的「停止」按鈕消失,一旦新剪輯啓動。

問題:

  • 我怎麼趕,當用戶決定切換到另一個剪輯沒有停止的第一個?
  • 我的切換按鈕的方法是否有意義?有更好的選擇嗎?

回答

0

如果您製作了處理MediaPlayer的服務,則可以向其發送意圖以控制播放/停止。在遊戲意圖中,您可以包含一個PendingIntent,當完成當前正在播放的媒體或由其他剪輯啓動時,由於某種原因停止當前播放的媒體時,該服務會將該PendingIntent發送回UI。

PendingIntent由列表項的onClick回調生成,所以它會自動調用正確的列表項回調並重置按鈕。

+0

謝謝您的回覆。我會仔細看看的。 –

0
  • 當用戶決定切換到另一個剪輯而不停止第一個剪輯時,該如何捕捉?

我認爲setOnCompletionListener可能是一個好主意,但不是release(),你應該調用stop()方法。如果它不能幫助你也可以跳過流到非常結束(seekTo(getDuration())方法)。這definietly將調用CompletionListener

  • 我的方法切換按鈕是否有意義呢?有更好的選擇嗎?

我認爲你不需要使用ImageButton。添加到您的適配器「選定」字段,您可以記住上次選擇的項目的編號。在getView()中,你可以檢查一些行是「被選中」,並使適當的圖像(播放/暫停)可見。然後將OnItemClickListener接口添加到您的Adapter類。當調用onItemClick方法時,檢查是否相同(然後暫停流並使「selected」字段爲空)或new(然後播放流並將新行號分配給「selected」字段)行被選中。使用notifyDataSetChanged()方法調用,以在列表視圖中生成具有正確圖像的新行。

+0

OnCompletionListener沒有得到,當有另一個項目中斷時,由於每個Play呼叫以mp.release()開頭,前一個mp實例剛被取消。 –

+0

此外,我確實需要ImageButton,因爲項目由一個textview和四個ImageButtons組成,在自定義列表視圖中,如果列表項被點擊,我不只是想要播放該項目。 問題的意思是:更換一個按鈕的drawable和方法是否更容易使用同一個按鈕來切換Play和Stop,或者更有意義的是有一個單獨的Play和Stop按鈕,但通過VISIBLE和GONE只能以完全相同的位置向用戶展示一個。 –

+0

對用戶來說,這並沒有什麼不同,他們看到一個播放按鈕,一旦他們點擊它,同一個地方就會出現一個停止按鈕,但是Java中的方法存在不同,這就是爲什麼我問。我沒有計劃放棄用戶已經習慣的整個佈局。 –