Android RecyclerView错误滚动重叠项

Android RecyclerView错误滚动重叠项,android,scroll,android-recyclerview,Android,Scroll,Android Recyclerview,我成功地用RecyclerView组件绘制了一个列表,但是当我有很多项时,如果我快速向下滚动,有时一项会在RecyclerView上重叠。如果我以“正常”的速度滚动,就永远不会出现这种糟糕的性能,只有当我在第一次加载RecyclerView时快速向下滚动。好像是个虫子。。。有什么想法吗?这是我的适配器中的代码: public class RecibosListRVAdapter extends RecyclerView.Adapter<RecibosListRVAdapter.ItemRe

我成功地用RecyclerView组件绘制了一个列表,但是当我有很多项时,如果我快速向下滚动,有时一项会在RecyclerView上重叠。如果我以“正常”的速度滚动,就永远不会出现这种糟糕的性能,只有当我在第一次加载RecyclerView时快速向下滚动。好像是个虫子。。。有什么想法吗?这是我的适配器中的代码:

public class RecibosListRVAdapter extends RecyclerView.Adapter<RecibosListRVAdapter.ItemReciboViewHolder> implements Filterable{

private static final String TAG = "RecibosListRVAdapter";
public static List<ItemRecibo> listRecibos, listRecibosFiltered;
private int lastPosition = -1;
Context context;
HashMap<String, Integer> hashLogos;

public InterfaceRecibo_Clicked asysncresponse;

TinyDB tini;

public static List<ItemRecibo> getListRecibosFiltered() {
    return listRecibosFiltered;
}
public static List<ItemRecibo> getListRecibos() {
    return listRecibos;
}

public static void setListRecibos(List<ItemRecibo> listRecibos) {
    RecibosListRVAdapter.listRecibos = listRecibos;
}

public static void setListRecibosFiltered(List<ItemRecibo> listRecibosFiltered) {
    RecibosListRVAdapter.listRecibosFiltered = listRecibosFiltered;
}

@Override
public Filter getFilter() {
    return new RecibosFilter(this, listRecibos);
}

private static class RecibosFilter extends Filter {

    private final RecibosListRVAdapter adapter;

    private final List<ItemRecibo> originalList;

    private final List<ItemRecibo> filteredList;

    private RecibosFilter(RecibosListRVAdapter adapter, List<ItemRecibo> originalList) {
        super();
        this.adapter = adapter;
        this.originalList = new LinkedList<>(originalList);
        this.filteredList = new ArrayList<>();
    }

    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        filteredList.clear();
        final FilterResults results = new FilterResults();

        if (constraint.length() == 0) {
            filteredList.addAll(originalList);
        } else {
            final String filterPattern = constraint.toString().toLowerCase().trim();

            for (final ItemRecibo user : originalList) {
                if (user.getMontante().contains(constraint)) {
                    filteredList.add(user);
                }
                if (user.getDescripcion().toLowerCase().contains(constraint.toString().toLowerCase())) {
                    filteredList.add(user);
                }
                if (user.getProveedor().toLowerCase().contains(constraint.toString().toLowerCase())) {
                    filteredList.add(user);
                }
                if (user.getEstado().toLowerCase().contains(constraint.toString().toLowerCase())) {
                    filteredList.add(user);
                }
                if (user.getFechaEntrada().toLowerCase().contains(constraint.toString().toLowerCase())) {
                    filteredList.add(user);
                }
            }
        }
        results.values = filteredList;
        results.count = filteredList.size();
        return results;
    }

    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
        adapter.listRecibosFiltered.clear();
        adapter.listRecibosFiltered.addAll((ArrayList<ItemRecibo>) results.values);
        adapter.notifyDataSetChanged();
    }
}

public RecibosListRVAdapter(FrmListadoRecibos activity, List<ItemRecibo> listRecibos, TinyDB tini)
{
    this.asysncresponse = activity;
    this.listRecibos = listRecibos;
    this.listRecibosFiltered = new ArrayList<>(listRecibos);
    hashLogos = Utilidades.rellenaHash();//TODO quitar estático
    this.tini = tini;
}

@Override
public RecibosListRVAdapter.ItemReciboViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
    context = parent.getContext();
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_listadorecibos, parent, false);
    ItemReciboViewHolder itemrecibo_holder = new ItemReciboViewHolder(v, new ItemReciboViewHolder.IMyViewHolderClicks()
    {
        public void onPotatoClick(View caller, int posClicked) {
            Log.d("TAG", "Poh-tah-tos");
            if(caller instanceof CardView) {
                asysncresponse.response_cardview_clicked(posClicked, (CardView) caller);
            }
        };
    });

    return itemrecibo_holder;
}

@Override
public void onBindViewHolder(RecibosListRVAdapter.ItemReciboViewHolder holder, int position)
{

    if(position < listRecibosFiltered.size()) {
        try {
            holder.imgempresa.setImageResource(hashLogos.get(listRecibosFiltered.get(position).getUrlicon()));//R.mipmap.icn_iberdrola_beta
        } catch (NumberFormatException ne) {
            Log.e(TAG, "mal formato en RecibosListRVAdapter asignando la url del icono de empresa");
            holder.imgempresa.setImageResource(R.mipmap.ic_launcher);
        }
        holder.txtrecibotitle.setText(listRecibosFiltered.get(position).getDescripcion());
        holder.txtestado.setText(listRecibosFiltered.get(position).getEstado());
        holder.txtfechavence.setText(listRecibosFiltered.get(position).getFechaEntrada());
        holder.txtfacturaimporte.setText(TextUtils.concat(listRecibosFiltered.get(position).getMontante(), Constants.EUROSUFIJO));

        if (tini.getBoolean(listRecibosFiltered.get(position).getId(), false)) {
            holder.cv.setCardBackgroundColor(context.getResources().getColor(R.color.pagado));
            holder.txtestado.setText(context.getResources().getString(R.string.pagado));
            holder.txtestado.setTextColor(context.getResources().getColor(R.color.pagadoestado));
            holder.txtestado.setTypeface(null, Typeface.BOLD);
        } else {
            holder.txtestado.setTextColor(context.getResources().getColor(R.color.pendienteorange));
            holder.txtestado.setTypeface(Typeface.createFromAsset(context.getAssets(), "fonts/robotolight.ttf"));

            if (position % 2 == 0)
                holder.cv.setCardBackgroundColor(context.getResources().getColor(R.color.orangelightest));
            else
                holder.cv.setCardBackgroundColor(context.getResources().getColor(R.color.orangelighter));

        }

        setAnimation(holder.itemView, position);
    }
}

// Apply some custom animations to loading the items in the list
private void setAnimation(View viewToAnimate, int position)
{
    // If the bound view wasn't previously displayed on screen, it's animated
    if (position > lastPosition)
    {
        Animation animation = AnimationUtils.loadAnimation(context, android.R.anim.slide_in_left);
        viewToAnimate.startAnimation(animation);
        lastPosition = position;
    }
}

@Override
public int getItemCount() {

    if(this.listRecibosFiltered!=null)
        return this.listRecibosFiltered.size();
    else
        return 0;
}

public static class ItemReciboViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener
{
    CardView cv;
    ImageView imgempresa;
    TextView txtrecibotitle;
    TextView txtestado;
    TextView txtfechavence;
    TextView txtfacturaimporte;

    public IMyViewHolderClicks mListener;

    ItemReciboViewHolder(View itemView, IMyViewHolderClicks listener) {
        super(itemView);

        mListener = listener;

        cv = (CardView)itemView.findViewById(R.id.itemlistadocard);
        imgempresa = (ImageView)itemView.findViewById(R.id.imgempresa);
        txtrecibotitle = (TextView)itemView.findViewById(R.id.txtfacturaname);
        txtestado = (TextView)itemView.findViewById(R.id.txtfacturaestado);
        txtfechavence = (TextView)itemView.findViewById(R.id.txtfacturafechavence);
        txtfacturaimporte = (TextView)itemView.findViewById(R.id.txtfacturaimporte);

        cv.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if (v instanceof CardView){
            mListener.onPotatoClick((CardView) v, this.getLayoutPosition());
        }
    }

    public static interface IMyViewHolderClicks {
        public void onPotatoClick(View caller, int posclick);
    }

}
公共类RecibosListRVAdapter扩展了RecyclerView。适配器实现可过滤{
私有静态最终字符串标记=“RecibosListRVAdapter”;
公共静态列表listRecibos,listRecibosFiltered;
private int lastPosition=-1;
语境;
HashMap-hashLogos;
公共接口CIBO_单击ASYSN应答;
TinyDB-tini;
公共静态列表getListRecibosFiltered(){
已过滤的返回列表;
}
公共静态列表getListRecibos(){
返回列表;
}
公共静态无效集合listRecibos(列表listRecibos){
RecibosListRVAdapter.listRecibos=listRecibos;
}
公共静态无效setListRecibosFiltered(列表listRecibosFiltered){
RecibosListRVAdapter.listRecibosFiltered=listRecibosFiltered;
}
@凌驾
公共过滤器getFilter(){
返回新的RecibosFilter(此,listRecibos);
}
私有静态类过滤器扩展过滤器{
专用最终接收器适配器;
私人最终名单原创者;
私人最终列表筛选列表;
专用ReciboFilter(ReciboListRVAdapter适配器,列表原始列表){
超级();
this.adapter=适配器;
this.originalList=新链接列表(originalList);
this.filteredList=新的ArrayList();
}
@凌驾
受保护的筛选器结果性能筛选(CharSequence约束){
filteredList.clear();
最终FilterResults结果=新的FilterResults();
if(constraint.length()==0){
filteredList.addAll(原始列表);
}否则{
final String filterPattern=constraint.toString().toLowerCase().trim();
对于(最终项目Recibo用户:originalList){
if(user.getMontante().contains(constraint)){
filteredList.add(用户);
}
if(user.getDescription().toLowerCase().contains(constraint.toString().toLowerCase())){
filteredList.add(用户);
}
if(user.getProveedor().toLowerCase().contains(constraint.toString().toLowerCase())){
filteredList.add(用户);
}
if(user.getEstado().toLowerCase().contains(constraint.toString().toLowerCase())){
filteredList.add(用户);
}
if(user.getFechaEntrada().toLowerCase().contains(constraint.toString().toLowerCase())包含{
filteredList.add(用户);
}
}
}
results.values=filteredList;
results.count=filteredList.size();
返回结果;
}
@凌驾
受保护的void publishResults(CharSequence约束、FilterResults结果){
adapter.listRecibosFiltered.clear();
adapter.listRecibosFiltered.addAll((ArrayList)results.values);
adapter.notifyDataSetChanged();
}
}
公共RecibosListRVAdapter(FrmListadoRecibos活动、列表Recibos、TinyDB tini)
{
this.asysnResponse=活动;
this.listRecibos=listRecibos;
this.listRecibosFiltered=新的ArrayList(listRecibos);
hashLogos=utilitidades.rellenaHash();//TODO quitar estático
this.tini=tini;
}
@凌驾
public RecibosListRVAdapter.ItemReciboViewHolder onCreateViewHolder(视图组父级,int-viewType)
{
context=parent.getContext();
视图v=LayoutInflater.from(parent.getContext()).flate(R.layout.item_listadorecibos,parent,false);
ItemReciboViewHolder itemrecibo_holder=新的ItemReciboViewHolder(v,新的ItemReciboViewHolder.IMyViewHolderClicks()
{
公共void onPotatoClick(视图调用者,int posClicked){
日志d(“标签”、“Poh tah tos”);
if(CardView的调用方实例){
AsysnResponse.response\u cardview\u clicked(posClicked,(cardview)调用者);
}
};
});
归还物品的持有者;
}
@凌驾
BindViewHolder上的公共无效(ReciboListRVAdapter.ItemReciboViewHolder,int位置)
{
if(位置