在RecyclerView中更改ImageView中的图像

时间:2017-03-06 11:37:44

标签: android android-recyclerview onclicklistener

我想更改ImageViewRecyclerView的图片。

例如:

我在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是界面

1 个答案:

答案 0 :(得分:3)

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

  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);
        }
    }
    
  4. 修改

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