2016-07-18 8 views
0

Я только начинаю разработку Android и Java, и это мое первое приложение, чтобы познакомиться с разработкой Android. Я почти закончил приложение, осталось только перетасовать песни. Я пробовал много шагов, чтобы все исправить, и я просмотрел веб-страницы, и я ответил на вопрос, но я все еще не могу понять.Перемешать песни в музыкальном проигрывателе

Этот фрагмент кода в моем классе обслуживания, список воспроизведения передается от основной деятельности:

public void setPlayList(ArrayList<SongModel> playlist) { 
     playList = playlist; 
     //Arraylist of integer to hold the number of indices 
     list = new ArrayList<Integer>(); 
     for(int i =0; i <= playList.size();i++){ 
     list.add(i); 
    } 

Collections.shuffle(list, new Random(System.nanoTime())); 
} 

Код ниже, как песни играют, этот фрагмент в configPlayBack() метод, который играет песню из песня ID:

long item = 0; 
item = playList.get(MusicPref.isShuffle(this)? list.get(position): position).getSongId(); 

фрагмент кода для воспроизведения следующей композиции:

public void playNext() { 
      position++; 
      if (position >= playList.size()) { 
       position = 0; 
      } 
     configPlayBack(); 
    } 

Но песни по-прежнему воспроизводятся последовательно.

EDIT:

public void configPlayBack(){ 
      prepared = true; 
      player.reset(); 
      if (playList.size()>0){ 
       long item = 0; 
       item = playList.get(MusicPref.isShuffle(this)? list.get(position):position).getSongId(); 
       playItem(item); 
      } 
     } 
     public void playItem(long item){ 
      Uri base = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
      Uri trackUri = ContentUris.withAppendedId(base, item); 
      try{ 
       player.setDataSource(getApplicationContext(), trackUri); 
      } 
      catch(Exception e){ 
       Log.e(TAG, "Errror setting data source", e); 
      } 
      try{ 
       player.prepare(); 
      } 
      catch(Exception ee) 
      { 
       ee.printStackTrace(); 
       Log.e(TAG, "Error setting data source", ee); 
       Toast.makeText(getApplicationContext(), "Song corrupt or not supported", Toast.LENGTH_SHORT).show(); 
       ee.printStackTrace(); 
       isReady = false; 
      } 
      player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
       @Override 
       public void onPrepared(MediaPlayer mp) { 
        isReady = true; 
          setPlayState(); 
          getAudioFocus(); 
          mp.start(); 
         updateNotificationPlayer(); 
          updatePlayback(); 
          updateSeek(); 
        player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
         @Override 
         public void onCompletion(MediaPlayer mp) { 
          isReady = false; 
          mp.reset(); 
          playNext(); 
         } 
        }); 
       } 
      }); 

     } 
+0

отправлять весь ваш метод воспроизведения –

+0

Я редактировал его, чтобы включить режим воспроизведения @Murat K. –

ответ

0

Хорошо вы перетасовки вновь созданный список с

Collections.shuffle(list, new Random(System.nanoTime()));

, но вы все еще используете старый список воспроизведения

item = playList.get(MusicPref.isShuffle(this)? list.get(position): position).getSongId(); 

И я не являюсь конечно, почему вы используете эту линию вообще. Измените его просто

item = list.get(position).getSongId(); 
+0

В списке, является ArrayList Целого (ArrayList список;) не ArrayList из Объект SongModel. Я также пытался, прежде чем создавать ArrayList из песниModel (ArrayList list;), а затем используя то, что вы предложили: item = list.get (position) .getSongId(); это заставляет перетасовку работать нормально, но позиция позиции RecyclerView меняется. когда вы нажимаете на определенную песню, она воспроизводит другую песню из-за перетасованного списка. @Murak K. –

+0

item = playList.get (MusicPref.isShuffle (this)? List.get (position): position) .getSongId(); Эта строка проверяет, включена ли перетасовка, если она истинна, она получает индекс песни для воспроизведения из перетасованного списка. Если false, он использует обычное положение. По крайней мере, так я думаю, что это должно сработать. Но по какой-то причине он не работает. –

+0

@JohnSmith Ну, вы попросили перетасованный список. Если ваш 'RecyclerView' не вписывается в него, это еще одна проблема, и вы должны создать для этого вопрос. –