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