【问题标题】:RecyclerView - Duplicate when scrolling, when item touched, it changes the item's backgroundRecyclerView - 滚动时重复,当项目被触摸时,它会改变项目的背景
【发布时间】:2017-03-21 12:30:08
【问题描述】:

我有一个回收站视图。我想在单击项目时更改项目的背景。 使用我的代码更改了单击的项目,但是在滚动时,也有一些项目的背景也发生了变化,并且在向后滚动时,初始项目的背景变回了默认值。

这是我的适配器:

公共类 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,并且有一个相对布局子。

【问题讨论】:

    标签: android android-recyclerview


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      RecyclerView 将重用视图来填充数据。您应该保存单击视图的位置。在OnClickListener保存位置:

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

      onBindViewHolder 中添加这些语句:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-12
        • 1970-01-01
        • 2023-03-15
        • 2016-11-18
        相关资源
        最近更新 更多