在 RecyclerView 中更改 ImageView 中的图像

Irf*_*lah 5 android onclicklistener android-recyclerview

我想更改ImageViewin的图像RecyclerView

例如 :

我在 a 中有 30 个项目,RecyclerView当我单击位置 1 的项目时,项目将图像从播放更改为暂停,然后当我向下滚动到位置 15 并单击播放按钮之前选择的按钮(项目 1)应该将图像更改回播放,项目 15 图像应该更改为暂停。我已经在 onbindViewHolder 中实现了 onClicklistener。但是,它正在更改错误项目中的图像。请帮我

if (mediaPlayer != null) {
    mediaPlayer.reset();
    mediaPlayer.stop();
    LinearLayout view = (LinearLayout) recyclerView.getChildAt(pos);
    ImageView button = (ImageView) view.findViewById(R.id.playbutton);
    button.setImageResource(R.drawable.ic_play_arrow_black_24dp);
}

playbutton.setOnClickListener(new View.OnClickListener() { 
    @Override
    public void onClick(View v) {
        boolean isPlaying = sharedPreferences.getBoolean(ConstantValue.ISPLAYING, false);
        RecordingDetail recordingDetail = list.get(getAdapterPosition());
        if (!isPlaying) {
            SharedPreferences.Editor editor = sharedPreferences.edit();
            editor.putBoolean(ConstantValue.ISPLAYING, true);
            editor.putInt(ConstantValue.CURRENTINDEX, getAdapterPosition());
            editor.commit();
            playbutton.setImageResource(R.drawable.ic_pause_black_24dp);
            mediaPlayerControl.Play(recordingDetail.path, getAdapterPosition(), progressBar);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这里播放按钮是我想要更改的图像视图,而 mediaPlayerControl 是接口

Nik*_*dze 6

您可以使用全局字段跟踪所选位置,然后检查当前视图是否被选中onBindViewHolder。此外,我强烈建议你分配onClickListener你的里面ViewHolder

  1. 声明一个全局变量:

    private int selectedPosition = -1;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 然后在您的onClick和调用中设置选定的位置notifyDatasetChanged

    @Override
    public void onClick(View view) {
        selectedPosition = getAdapterPosition();    
    
        if (mediaPlayer != null) {
            mediaPlayer.reset();
            mediaPlayer.stop();
        }
    
        RecordingDetail recordingDetail = list.get(selectedPosition);            
    
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putBoolean(ConstantValue.ISPLAYING, true);
        editor.putInt(ConstantValue.CURRENTINDEX, selectedPosition);
        editor.commit();
    
        mediaPlayerControl.Play(recordingDetail.path, selectedPosition, progressBar);
    
        notifyDatasetChanged();
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 最后检查您选择的位置onBindViewHodler并设置适当的图像:

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        LinearLayout view = holder.linearLayout;
        ImageView button = (ImageView) view.findViewById(R.id.playbutton);
    
        if (position == selectedPosition) {
            button.setImageResource(R.drawable.ic_pause_black_24dp);
        } else {
            button.setImageResource(R.drawable.ic_play_arrow_black_24dp);
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

编辑

正如@shalafi 所建议的,您不应该在RecyclerView适配器内保留对特定视图的引用,因为这些视图正在被回收(重用)。