【问题标题】:notifyitemchanged(position) refreshes the item in the list the first time but no more after thatnotifyitemchanged(position) 第一次刷新列表中的项目,但之后不再刷新
【发布时间】:2018-09-12 21:00:26
【问题描述】:

我的应用中发生了一些非常不寻常的事情。当我点击这个视图时,我将之前的位置设置为当前位置,这样下次我按下视图时,notifyItemChanged(position) 方法会刷新之前的位置。奇怪的是第一次它就像一个护身符,但是当第二次或第三次等等时,它并没有刷新项目。在 logcat 中,一切似乎也很正常。它通过代码没有警告或错误。这是我的代码:

我的变量 previous_pos 在我的 Adapter 类的顶部初始化。

private int previous_pos = -1;

这是我的适配器类的 sn-p

@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();
            }


        }
    });

【问题讨论】:

    标签: android android-recyclerview android-viewholder notifydatasetchanged


    【解决方案1】:

    只需将您的 setOnClickListeneronBindViewHolder 移动到 onCreateViewHolder

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-25
      • 2017-01-13
      • 2018-07-13
      • 2019-08-16
      • 2021-08-23
      • 2012-11-23
      • 2018-08-21
      • 1970-01-01
      相关资源
      最近更新 更多