RecyclerView - 滚动时重复,当项目被触摸,它改变项目的背景

问题描述:

我有一个recyclerview。我想在点击时更改项目的背景。 随着我的代码点击项目被更改,但滚动时,也有项目的背景也发生了变化,当滚动回来时,初始项目的背景变回默认。RecyclerView - 滚动时重复,当项目被触摸,它改变项目的背景

这里是我的适配器:

公共类MyCustomAdapter扩展RecyclerView.Adapter {

private Context context; 

private ArrayList<Information> data; 

private LayoutInflater inflater; 

private int previousPosition = 0; 

private Resources resources; 

private Drawable drawable; 

public MyCustomAdapter(Context context, ArrayList<Information> data) { 

    this.context = context; 
    this.data = data; 
    inflater = LayoutInflater.from(context); 
} 

@Override 
public MyViewHolder onCreateViewHolder(ViewGroup parent, int position) { 

    View view = inflater.inflate(R.layout.list_item_row, parent, false); 

    MyViewHolder holder = new MyViewHolder(view); 

    return holder; 
} 

@Override 
public void onBindViewHolder(final MyViewHolder myViewHolder, final int position) { 

    myViewHolder.textView1.setText(data.get(position).title); 
    //myViewHolder.imageView.setImageResource(data.get(position).imageId); 

    if(position > previousPosition){ // We are scrolling DOWN 

     AnimationUtil.animate(myViewHolder, true); 

    }else{ // We are scrolling UP 

     AnimationUtil.animate(myViewHolder, false); 
    } 

    previousPosition = position; 

    final int currentPosition = position; 
    final Information infoData = data.get(position); 


    myViewHolder.cardView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Toast.makeText(context, "Onlick Called at position "+position, Toast.LENGTH_LONG).show(); 
      //myViewHolder.imageView.setImageResource(data.get(position).imageId); 
      resources = context.getResources(); 
      drawable = resources.getDrawable(data.get(position).imageId); 
      myViewHolder.relativeLayout.setBackground(drawable); 
     } 
    }); 

} 

@Override 
public int getItemCount() { 
    return data.size(); 
} 

class MyViewHolder extends RecyclerView.ViewHolder{ 

    TextView textView1; 
    TextView textView2; 
    CardView cardView; 
    ImageView imageView; 
    RelativeLayout relativeLayout; 


    public MyViewHolder(View itemView) { 
     super(itemView); 
     textView1 = (TextView) itemView.findViewById(R.id.card_front_text1); 
     textView2 = (TextView) itemView.findViewById(R.id.card_front_text2); 
     imageView = (ImageView) itemView.findViewById(R.id.card_front_imageview); 
     relativeLayout = (RelativeLayout) itemView.findViewById(R.id.card_front_relativelayout); 
     cardView = (CardView) itemView.findViewById(R.id.cardView); 
    } 
} 

}

XML:

临屋父布局是Cardview,并有一个相对布局的孩子。

RecyclerView将重新使用视图来填充数据。你应该保存点击视图的位置。在OnClickListener保存位置:

myViewHolder.cardView.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     clickedPosition = position; 
     ...... 
    } 
}); 

而在onBindViewHolder添加这些statments:

if (position == clickedPosition) { 
    resources = context.getResources(); 
    drawable = resources.getDrawable(data.get(position).imageId); 
    myViewHolder.relativeLayout.setBackground(drawable); 
} else { 
    myViewHolder.relativeLayout.setBackground(/* default background*/); 
} 

因为项目视图被RecyclerView重复使用。 在onBindViewHolder方法中,您必须将项目视图设置为正确的状态。