Просмотрщик Recyclerview можно ли менять представления в других позициях адаптера (не в текущей позиции)?

У меня есть recyclerview с медиаплеером для воспроизведения песни в каждой строке. У меня есть только одна кнопка для воспроизведения/остановки, которая меняет символ.

Вот моя проблема:

Пример 1 (отлично работает):

(Для положения адаптера 1) пользователь нажимает символ воспроизведения, и музыка воспроизводится для этого положения адаптера, и символ меняется на символ остановки, затем он нажимает символ остановки, и музыка останавливается, а символ снова меняется на символ воспроизведения, готовый к запуску. снова музыка.

Пример 2 (это проблема)

(Для положения адаптера 1) пользователь нажимает символ воспроизведения, и для этого положения адаптера воспроизводится музыка, а символ меняется на символ остановки. Не нажимая эту кнопку снова, они затем нажимают символ воспроизведения (положение адаптера 3), поэтому теперь они пытаются воспроизвести песню на позициях 1 и 3 одновременно. Я исправил одновременное воспроизведение обеих песен, так что при нажатии второй песни воспроизводимый носитель сбрасывается, а исходный файл песни заменяется новой песней (за раз будет воспроизводиться только одна).

Затем проблема возникает, даже если медиаплеер ведет себя должным образом. Медиаплеер управляется в mainactivity. Изображение кнопки воспроизведения/остановки (imageview) изменяется в окне просмотра адаптера, и я не могу найти способ изменить символ воспроизведения/остановки при одновременном нажатии более одной песни.

На этом изображении показан пример, когда были нажаты и песня 1, и песня 3. Теперь воспроизводится только песня 3, но изображения по-прежнему отображаются так, как будто обе песни воспроизводятся одновременно.

введите описание изображения здесь

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

class AddVideoAudioViewHolder extends RecyclerView.ViewHolder{

    ImageView PlayButton;
    Button AddAudioButton;
    TextView Title;
    public AddVideoAudioViewHolder(View itemView) {
        super(itemView);

        PlayButton = (ImageView) itemView.findViewById(R.id.PlayStopAudioDemo);
        PlayButton.setTag(1);
        PlayButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                int PlayStopButtonState = (int) PlayButton.getTag();

                if (PlayStopButtonState == 1) {
                    mVideoAudioCallbacks.onClick(100 + getAdapterPosition());
                    PlayButton.setImageResource(R.drawable.playstop);
                    PlayButton.setTag(2);

                } else {

                    mVideoAudioCallbacks.onClick(200 + getAdapterPosition());
                    PlayButton.setImageResource(R.drawable.playarrow);
                    PlayButton.setTag(1);
                }


            }
        });

и это метод в основном действии, когда я обрабатываю случай воспроизведения двух песен:

public void PlaySong (int SongNumber, int ObjectInt){


    if (mp == null) {

        mp = new MediaPlayer();

    }else{
        mp.reset();
    }

    try {
        mp.setDataSource(this, Uri.parse("android.resource://com.example.nick.accountable/" + SongArray[SongNumber]));
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        mp.prepare();
    } catch (IOException e) {
        e.printStackTrace();
    }
    mp.start();



}

Итак, мой вопрос, могу ли я добавить некоторый код в держатель представления или в основное действие, который может изменить все другие представления, кроме текущей позиции адаптера. т.е. Если щелкнуть песню номер 3 для воспроизведения, установите изображение для позиций 1-2 и 4-10 как невоспроизводимое или есть лучший способ сделать это.

Спасибо за помощь Николай


person Nicholas Muir    schedule 09.02.2016    source источник


Ответы (2)


В вашем адаптере есть переменная int, чтобы поддерживать, какая позиция воспроизводится

int mCurrentPlayingPosition = -1; // if -1 nothing is playing

в вашей кнопке воспроизведения на прослушивателе кликов, сделайте это

PlayButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                int PlayStopButtonState = (int) PlayButton.getTag();

                int previousPosition = mCurrentPlayingPosition;
                if (PlayStopButtonState == 1) {

                    mCurrentPlayingPosition = getAdapterPosition();

                    mVideoAudioCallbacks.onClick(100 + getAdapterPosition());
                    PlayButton.setImageResource(R.drawable.playstop);
                    PlayButton.setTag(2);

                } else {
                    mCurrentPlayingPosition = -1; // nothing wil be played after hitting stop
                    mVideoAudioCallbacks.onClick(200 + getAdapterPosition());
                    PlayButton.setImageResource(R.drawable.playarrow);
                    PlayButton.setTag(1);
                }

                if(previousPosition != -1)
                    notifyItemChanged(previousPosition);

            }
        });

в вашем onBindViewHolder сделайте следующее

@Override
public void onBindViewHolder(AddVideoAudioViewHolder holder, int position) {
    if(mCurrentPlayingPosition == position ){
       // display stop icon
    } else {
       // display play icon
    }
}
person Much Overflow    schedule 09.02.2016
comment
Спасибо за помощь. - person Nicholas Muir; 13.02.2016

Если вы хотите изменить все остальные представления, когда действие выполняется в определенной строке, вы можете вызвать notifyDataSetChanged() и написать, если еще, чтобы решить вашу проблему в onBindViewHolder

person Suhail Mehta    schedule 09.02.2016
comment
Я не уверен, как это применить. Набор данных не изменился. Вы говорите, что у меня должен быть массив логических значений, которые представляют состояние кнопки просмотра изображения (воспроизведение/остановка)? Также есть ли проблема с памятью при нажатии кнопки? - person Nicholas Muir; 09.02.2016
comment
Спасибо за помощь. - person Nicholas Muir; 13.02.2016