RecyclerView出现了问题

时间:2016-12-02 23:07:29

标签: android android-recyclerview recycler-adapter

每次创建适配器时,都会向RecyclerView添加新项目。 在照片中,我展示了一个显示变暗的菜肴图像的过程,尽管我使用条件if(holder.mDish.getPicurl()!=null)管理图像变暗,但它确实有效。

如果我进入暗盘图像细节并返回列表,将会有三个变暗的图像。这是RecyclerView的问题还是我的错?

enter image description here

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    holder.mDish = DISHES.get(position);
    final int id = holder.mDish.getId();

   if(holder.mDish.getPicurl()!=null) {
        Picasso.with(mContext)
                .load(holder.mDish.getPicurl())
                .fit()
                .transform(new RoundedTransformation(20, 0))
                .into(holder.mIvBackground);
        holder.mIvBackground.setColorFilter(Color.parseColor("#aaaaaa"), PorterDuff.Mode.MULTIPLY);
    } else {
        holder.mIvBackground.setImageResource(R.drawable.vector_drawable_dish);
    }


    holder.mTvName.setText(holder.mDish.getName());
    //holder.mTvDescription.setText(holder.mDish.getDescription());
    holder.mTvPrice.setText("T " + String.valueOf(holder.mDish.getPrice()));
    holder.mBtnAdd.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if(mListener!=null){
                mListener.onAddToBasketInteraction(id);
            }
        }
    });
    holder.mView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            mListener.onStartDetailActivity(id);
        }
    });
}


public void addDishes(List<Dish> dishes){
    DISHES.clear();
    DISHES.addAll(dishes);
    notifyDataSetChanged();
}


public class ViewHolder extends RecyclerView.ViewHolder {

    public Dish mDish;
    public final View mView;
    public final ImageView mIvBackground;
    public final TextView mTvName;
    //public final TextView mTvDescription;
    public final TextView mTvPrice;
    public final ImageButton mBtnAdd;

    public ViewHolder(View itemView) {
        super(itemView);
        mView = itemView;
        mIvBackground = (ImageView) itemView.findViewById(R.id.dishBackground);
        mTvName = (TextView) itemView.findViewById(R.id.name);
        //mTvDescription = (TextView) itemView.findViewById(R.id.description);
        mTvPrice = (TextView) itemView.findViewById(R.id.price);
        mBtnAdd = (ImageButton) itemView.findViewById(R.id.btnAdd);
    }
}

项目的xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="90dp"
    android:orientation="horizontal"
    android:padding="2dp">

    <ImageView
        android:id="@+id/dishBackground"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
    <TextView
        android:id="@+id/name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Плов узбекский"
        android:textColor="@color/colorAccent2"
        android:layout_marginLeft="5dp"
        android:layout_marginBottom="5dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:textSize="14sp" />



    <TextView
        android:id="@+id/price"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="5dp"
        android:layout_marginTop="5dp"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:text="T 3000"
        android:textColor="@android:color/holo_orange_light" />

    <ImageButton
        android:id="@+id/btnAdd"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:layout_alignParentRight="true"
        android:layout_alignParentBottom="true"
        android:layout_marginRight="5dp"
        android:layout_marginBottom="5dp"
        android:layout_marginLeft="5dp"
        android:layout_marginTop="5dp"
        android:background="@drawable/ic_add_shopping_cart_black_24dp" />



</RelativeLayout>

1 个答案:

答案 0 :(得分:1)

您不会撤消条件语句

中的视图更改

罪魁祸首就是这段代码:

if(holder.mDish.getPicurl()!=null) {
    Picasso.with(mContext)
            .load(holder.mDish.getPicurl())
            .fit()
            .transform(new RoundedTransformation(20, 0))
            .into(holder.mIvBackground);
    holder.mIvBackground.setColorFilter(Color.parseColor("#aaaaaa"), PorterDuff.Mode.MULTIPLY);
} else {
    holder.mIvBackground.setImageResource(R.drawable.vector_drawable_dish);
}

RecyclerView的工作方式是使用不同的数据重复使用相同的视图(因此 recycler ),因此每个位置可以多次调用onBindViewHolder方法,但ViewHolder可能已经创建并且先前已绑定到不同的数据。这样,应用于onBindViewHolder方法内部视图的某些更改可能会通过对不同数据块的绑定调用而持续存在。

在您的情况下,请拨打以下电话:

holder.mIvBackground.setColorFilter(Color.parseColor("#aaaaaa"), PorterDuff.Mode.MULTIPLY);

使用滤镜在onBindViewHolder的一次调用中改变视图。然后,当另一条数据绑定到同一ViewHolder时,条件holder.mDish.getPicurl()!=null可能为false,但效果仍然存在,因为{{1}中没有删除此滤色器你的陈述的分支。

修复

对于您希望实施的每个单独条件,您需要在else中明确设置并取消设置对单个视图的任何更改:

RecyclerView

您没有看到if(holder.mDish.getPicurl()!=null) { holder.mIvBackground.setColorFilter(Color.parseColor("#aaaaaa"), PorterDuff.Mode.MULTIPLY); } else { holder.mIvBackground.setColorFilter(null); // removes color filter } 的任何问题,因为您在if-else语句的每个分支中设置了不同的问题,因此不会出现不需要的状态。