2016-09-06 5 views
0

오디오 재생을위한 앱을 만들었습니다. ListView를 만들어 노래를 나열하고 노래를 배열에 추가했으며 목록에있는 항목을 클릭 할 때 노래를 재생합니다.ArrayAdapter 외부의 배열에서 객체의 위치 사용

이제 응용 프로그램과 함께 내장 된 MediaController를 사용하고 싶습니다. 재생중인 트랙의 위치를 ​​참조 할 수 없기 때문에 다음 트랙과 이전 트랙 사이를 전환하는 메소드를 구현하는 데 문제가 있습니다.

여기에 자바 파일

public class AlternateActivity extends AppCompatActivity implements MediaPlayerControl, AdapterView.OnItemClickListener { 

    private ListView songView; 
     private MediaPlayer mediaPlayer; 
     private final String[] songList = {"Song 1", "Song 2", "Song 3", "Song 4", "Song 5"}; 

     private final int[] songID = {R.raw.track1, R.raw.track2, R.raw.track3, R.raw.track4, R.raw.track5}; 



     private MusicController musicController; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_alternate); 

      mediaPlayer = new MediaPlayer(); 

      songView = (ListView) findViewById(R.id.song_list); 
      ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, songList); 
      songView.setAdapter(adapter); 

      songView.setOnItemClickListener(this); 

      setMusicController(); 


     }; 



     public void playSong(int position){ 
      mediaPlayer.reset(); 
      mediaPlayer = MediaPlayer.create(getApplicationContext(), songID[position]); 
      mediaPlayer.start(); 

     } 

     private void setMusicController(){ 
      musicController = new MusicController(this); 
      musicController.setPrevNextListeners(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        playNext(); 
       } 
      }, new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        playPrev(); 
       } 
      }); 

      musicController.setMediaPlayer(this); 
      musicController.setAnchorView(findViewById(R.id.song_list)); 
      musicController.setEnabled(true); 
     } 

    @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      playSong(position); 
     } 


     public void playPrev(){ 

     } 

     public void playNext(){ 

     } 
    } 

이 구현하는 올바른 방법은 무엇입니까?

Layout.xml

세계적으로 클래스
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    android:background="#FFAA50" 
    tools:context=".AlternateActivity" > 

    <ListView 
     android:id="@+id/song_list" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" > 
    </ListView> 

</LinearLayout> 
+1

현재 위치를 저장하는 전용 멤버 변수'currentPosition' 만 있으면됩니다. 'playSong'은이 변수를 설정합니다. 이제'playPrev'를 구현하는 것은 첫 번째 항목과 마지막 항목의 구석을 고려하여'playSong (currentPosition - 1) '을 호출하는 것입니다. –

답변

2

선언 위치 .....

private int position=0; 

이를 사용 .....

@Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      this.position=position; 
      playSong(position); 
     } 


     public void playPrev(){ 
using "songID--;" gives error "Cannot assign a value to final variable songID" 
       if(position>0) 
        playSong(--position); 
       ----- what to do here? ------ 
     } 

     public void playNext(){ 
        if(position<(songList.length-1)) 
        playSong(++position); 
        ----- what to do here? ------ 
     } 

참고 : - 위치는 어떤 노래를 재생하고 NPE와 ArrayOutOfIndex 예외를 해결하기 위해 위의 조건을 유지하고 있습니다 ...

+0

이것은 원래 질문과 정확히 관련이 없지만 항상 화면 하단에 MediaController를 표시하도록 설정하는 방법이 있습니까? – Devansh

+0

레이아웃에서 MediaController보기를 의미합니까 ?? – sushildlh

+0

레이아웃에 MediaController 뷰를 추가하지 않았습니다. 액티비티 – Devansh