Recyclerview持有人混合滚动

时间:2018-03-24 07:29:18

标签: java android android-recyclerview

滚动回收时查看某些项目混合。在每15件商品之后添加广告后,持有人会收到错误的数据。有些商品是贵宾商品。我会改变这些项目的背景颜色。但是当我滚动它时,dublicates混合。我怎么解决?

这是我的适配器

private Context mCtx;
private List<Car> carList;
private RecyclerViewAnimator mAnimator;
private int AD_TYPE=1;
private int CONTENT_TYPE=2;
private int LIST_AD_DELTA=15;

public ProductAllCarAdapter(RecyclerView recyclerView,Context mCtx, List<Car> carList) {
    this.mCtx = mCtx;
    this.carList = carList;
    mAnimator = new RecyclerViewAnimator(recyclerView);
}

@Override
public ProductAllCarAdapter.ProductViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    if(viewType == AD_TYPE){
        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.product_add_item, null);
        ProductAllCarAdapter.ProductViewHolder vh = new ProductAllCarAdapter.ProductViewHolder(itemView);
        mAnimator.onCreateViewHolder(itemView);
        return vh;
    } else {
        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.product_car_item, null);
        ProductAllCarAdapter.ProductViewHolder vh = new ProductAllCarAdapter.ProductViewHolder(itemView);
        mAnimator.onCreateViewHolder(itemView);
        return vh;
    }
}

@Override
public int getItemViewType(int position) {
    if (position>0 && position % LIST_AD_DELTA == 0)
        return AD_TYPE;
    return CONTENT_TYPE;
}

@Override
public void onBindViewHolder(ProductAllCarAdapter.ProductViewHolder holder, int position) {
    if (getItemViewType(position) == CONTENT_TYPE) {
        final Car car = carList.get(holder.getAdapterPosition());
        GlideApp.with(mCtx).load(car.getImg()).into(holder.imageView);

        if (car.getVip() == 1) {
            holder.relativeLayout.setBackgroundColor(ContextCompat.getColor(mCtx, R.color.colorVip));
            holder.imageViewVIP.setVisibility(View.VISIBLE);
        }

        final String carid = String.valueOf(car.getCarid());
        mAnimator.onBindViewHolder(holder.itemView, position);

    } else {
        holder.mView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Context mcontext = view.getContext();
                Bundle bundle = ActivityOptionsCompat.makeCustomAnimation(mcontext, android.R.anim.fade_in, android.R.anim.fade_out).toBundle();
                Intent intent = new Intent(mcontext, AdsItem.class);
                mcontext.startActivity(intent, bundle);
            }
        });

        mAnimator.onBindViewHolder(holder.itemView, position);
    }
}

private int getRealPosition(int position) {
    if (LIST_AD_DELTA == 0) {
        return position;
    } else {
        return position - position / LIST_AD_DELTA;
    }
}

@Override
public long getItemId(int position) {   return position;   }

@Override
public int getItemCount() {
    int additionalContent = 0;
    if (carList.size() > 0 && carList.size() > LIST_AD_DELTA) {
        additionalContent = ( carList.size() / LIST_AD_DELTA);
    }
    return carList.size() + additionalContent;
}

public static class ProductViewHolder extends RecyclerView.ViewHolder {

    private View mView;
    ImageView imageView, imageViewVIP;
    RelativeLayout relativeLayout;

    public ProductViewHolder(View itemView) {
        super(itemView);
        mView = itemView;
        imageView = itemView.findViewById(R.id.imageView);
        imageViewVIP = itemView.findViewById(R.id.imageViewVIP);
        relativeLayout = itemView.findViewById(R.id.relativeLayoutpc);

    }

    public void setOnClickListener(View.OnClickListener listener) {
        mView.setOnClickListener(listener);
    }
}

我认为问题onBindViewHolder函数使用了错误的持有者。 ArrayList也会返回true值,但滚动时会混合。

1 个答案:

答案 0 :(得分:0)

您只需添加以下print(2*n - 1) 语句块的相应else即可。

if

这是在if (car.getVip() == 1) { holder.relativeLayout.setBackgroundColor(ContextCompat.getColor(mCtx, R.color.colorVip)); holder.imageViewVIP.setVisibility(View.VISIBLE); } else { holder.relativeLayout.setBackgroundColor(ContextCompat.getColor(mCtx, R.color.colorNormal)); holder.imageViewVIP.setVisibility(View.GONE); } 功能中,其中视图类型为onBindViewHolder

希望能解决你的问题。