【问题标题】:Change Image in ImageView In RecyclerView在 RecyclerView 中的 ImageView 中更改图像
【发布时间】:2017-03-06 11:37:44
【问题描述】:

我想在RecyclerView 中更改ImageView 的图像。

例如:

我在RecyclerView 中有 30 个项目,当我单击位置 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);
        }
    }
}

这里播放按钮是我要更改的图像视图,mediaPlayerControl 是界面

【问题讨论】:

  • 请发布您的代码

标签: android android-recyclerview onclicklistener


【解决方案1】:

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

  1. 声明一个全局变量:

    private int selectedPosition = -1;
    
  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();
    }
    
  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);
        }
    }
    

编辑

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

【讨论】:

  • 好答案,也许补充一点,你不能这样做的原因是保持对视图的引用是视图正在被回收(正如 RecyclerView 的名字所暗示的那样)
  • LinearLayout view = (LinearLayout) recyclerView.getChildAt(pos); ImageView 按钮 = (ImageView) view.findViewById(R.id.playbutton);
  • 这些行返回 null
  • 请发布您的ViewHolder
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多