notifyitemchanged (position) обновляет элемент в списке в первый раз, но не более того - PullRequest
0 голосов
/ 13 сентября 2018

Что-то очень необычное происходит в моем приложении.Когда я нажимаю на это представление, я устанавливаю предыдущую позицию на текущую позицию, чтобы в следующий раз, когда я нажимаю на представление, метод notifyItemChanged (position) обновит предыдущую позицию.Странно то, что в первый раз он работает как заклинание, но когда дело доходит до второго или третьего раза и так далее, он не обновляет предмет.В logcat тоже все вроде нормально.Он проходит через код без предупреждений или ошибок.Вот мой код:

Моя переменная previous_pos инициализируется в верхней части моего класса Adapter.

private int previous_pos = -1;

Это фрагмент моего класса Adapter

@Override
public void onBindViewHolder(@NonNull final TrackHolder holder, final int position) {
    holder.mInstrumentalName.setText(tracks.get(position).getInstrumentalName());
    holder.mProducer.setText(tracks.get(position).getProducer());


    Log.d("position", Integer.toString(holder.getAdapterPosition()));
    holder.mPlayButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            if (previous_pos != -1) {
                notifyItemChanged(previous_pos);
            }

            previous_pos = holder.getAdapterPosition();
            holder.mPlayButton.toggle();



            if (mediaPlayer.isPlaying()) {

                mediaPlayer.reset();
                mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                try {
                    mediaPlayer.setDataSource(tracks.get(position).getMusicLink());
                } catch (IOException e) {
                    e.printStackTrace();
                }
                mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                    @Override
                    public void onPrepared(MediaPlayer mediaPlayer) {
                        mediaPlayer.start();
                    }
                });
                mediaPlayer.prepareAsync();

            } else {
                mediaPlayer.reset();
                mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                try {
                    mediaPlayer.setDataSource(tracks.get(position).getMusicLink());
                    previous_link = tracks.get(position).getMusicLink();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                    @Override
                    public void onPrepared(MediaPlayer mediaPlayer) {
                        mediaPlayer.start();
                    }
                });
                mediaPlayer.prepareAsync();
            }


        }
    });

    mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mediaPlayer) {
            mediaPlayer.release();
        }
    });

    holder.setItemClickListener(new ItemClickListener() {
        @Override
        public void onItemClick(View v, int pos) {
            Toast.makeText(context, Integer.toString(tracks.size()), Toast.LENGTH_SHORT).show();
        }
    });
}

holder.mPlayButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {


            if (previous_pos != -1) {
                notifyItemChanged(previous_pos);
            }

            previous_pos = holder.getAdapterPosition();
            holder.mPlayButton.toggle();



            if (mediaPlayer.isPlaying()) {

                mediaPlayer.reset();
                mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                try {
                    mediaPlayer.setDataSource(tracks.get(position).getMusicLink());
                } catch (IOException e) {
                    e.printStackTrace();
                }
                mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                    @Override
                    public void onPrepared(MediaPlayer mediaPlayer) {
                        mediaPlayer.start();
                    }
                });
                mediaPlayer.prepareAsync();

            } else {
                mediaPlayer.reset();
                mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                try {
                    mediaPlayer.setDataSource(tracks.get(position).getMusicLink());
                    previous_link = tracks.get(position).getMusicLink();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                    @Override
                    public void onPrepared(MediaPlayer mediaPlayer) {
                        mediaPlayer.start();
                    }
                });
                mediaPlayer.prepareAsync();
            }


        }
    });

1 Ответ

0 голосов
/ 13 сентября 2018

Просто переместите setOnClickListener с onBindViewHolder на onCreateViewHolder.

...