Метод BaseAdapter, метод getView() предоставит вам представление, и вы должны изменить цвет вашей текущей дорожки, установив переменную в свой список и сбросив этот цвет по умолчанию, если переменная не установлена.
if (is this the current playing track) {
// Set the color of the view.
} else {
// Set the color to default.
}
Если вы реализовали эту логику в настоящее время, то при смене текущего трека, а также переменную в списке, который отслеживает текущее воспроизведение медиа, простой songAdt.notifyDataSetChanged() попросит BaseAdapter к снова вызываться и будет устанавливать представление в соответствии с новыми данными. Для более глубокого понимания ListView вы можете обратиться this talk. Это поможет.
Желательно рассмотреть возможность обучения самостоятельно с помощью RecyclerView, его настоящего. ListView был ужасным прошлым.
public class Activity implements SongChangedListener {
...
@Override
onCreate() {
....
PlayerManager pManager = new PlayerManager();
}
onResume() {
pManager.setListener(this);
}
onPause() {
pManager.setListener(null);
}
@Override
void songChanged (MediaId idOfSong) {
if (getActivity == null) //If you received a callback after activity was killed.
return;
// Change the current song as not playing in List. (for your adapter)
// Change the idOfSong to currently playing in List (for your adapter).
// change currentSong = idOfSong;
// notify that the data in List has changed (songAdt.notifyDataSetChanged)
}
}
И в вашем PlayerManager, вы можете создать интерфейс, или, возможно, индивидуальный класс для интерфейса, не имеет значения, как вы посылаете экземпляр интерфейса.
public class PlayerManager {
...
private SongChangedListener mListener;
...
public PlayerManager() {
}
public void setListener(SongChangedListener listener) {
mListener = listener;
}
public interface SongChangedListener {
void songChanged(MediaId idOfSong);
}
...
public void playSong() {
...
if (mListener != null)
mListener.songChanged(idOfNextSong);
...
}
В своем ответе вы передаете свою деятельность в свои службы, что во многих отношениях кажется неправильным. Если вы хотите реализовать связь между деятельностью и сервисом, есть много других способов сделать это. Обычно я использую Messenger в сочетании с обработчиком. Я бы предоставил более подробную информацию, но было бы более полезно, если бы вы исследовали его в документации и в других ответах. Его легко реализовать, как только вы поймете, как работают Messenger.
Кроме того, если вы ищете полнофункциональное приложение MediaPlayer, для вашей реализации потребуется намного больше кода котла. Также вам придется обрабатывать клики MediaButton (если кто-то нажал на воспроизведение/паузу на своих наушниках bluetooth или на их часах). Предпочтительно MediaSessionCompat является лучшей реализацией. Вы также можете ссылаться на следующий открытый MediaPlayer с открытым исходным кодом, который прекрасно реализует все минимально необходимые функции android-UniversalMusicPlayer.
У меня songAdt.notifyDataSetChanged() в моем основном классе деятельности. Я использую его, когда меняю песни вручную. Проблема возникает, когда MediaPlayer автоматически переходит к следующей песне после завершения. Я не могу назвать songAdt.notifyDataSetChanged() в классе MediaPlayer, поскольку songAdt неизвестен. – PatriceG
Попробуйте добавить обратные вызовы, создайте интерфейс в классе медиаплеера ur и получите метод с именем songChanged(). Внесите этот интерфейс в ur mainActivity, и когда вы смените песню в классе MediaPlayer, вызовите этот метод, чтобы изменение песни отражалось в ur mainActivity. Это довольно распространенный дизайн, используемый с обратными вызовами, чтобы уведомлять активность об изменениях. – Roadblock
U должен будет передать экземпляр ur mainActivity для класса MediaPlayer (использовать конструктор MediaPlayers). Используйте этот экземпляр, чтобы вызвать метод songChanged. – Roadblock