2015-01-28 30 views
10

Uso RecyclerView per una lunga lista e quando si scorre troppo velocemente, accade qualcosa di strano. Ci sono due problemi.qualcosa di strano accade mentre si scorre RecyclerView troppo veloce

Il primo è quello nell'immagine qui sotto. Uno degli elementi (come quello con bordi rossi nell'immagine) si appiccica su alcune parti casuali dello schermo e blocca altri oggetti. Scompare quando la versione reale di quell'elemento diventa visibile sullo schermo.

screenshot

Un altro problema per sfogliare questo lungo RecyclerView troppo veloce sta attaccando effetto onClick. Alcuni oggetti diventano visibili come qualcuno li sta premendo.

Questi problemi riguardano il mio adattatore o sono problemi comuni su RecyclerView? Qui è il mio adattatore:

public class SimpleListItemRecyclerAdapter extends RecyclerView.Adapter<SimpleListItemRecyclerAdapter.ListItemViewHolder> { 

    Context context; 
    ArrayList<RecyclerItemModel> list; 
    OnRecyclerViewItemClickListener onRecyclerViewItemClickListener; 
    private int lastPosition = -1; 
    private boolean isClickable; 

    public SimpleListItemRecyclerAdapter(ArrayList<RecyclerItemModel> list, _FragmentTemplate fragment) { 
     this.list = list; 
     this.context = fragment.getActivity(); 
     try { 
      this.onRecyclerViewItemClickListener = (OnRecyclerViewItemClickListener) fragment; 
      isClickable = true; 
     } catch (ClassCastException e) { 
      isClickable = false; 
     } 
     setHasStableIds(true); 
    } 

    @Override 
    public ListItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View itemView = LayoutInflater.from(parent.getContext()). 
       inflate(R.layout.item_sub_main_list_single_text, 
         parent, 
         false); 
     return new ListItemViewHolder(itemView, onRecyclerViewItemClickListener, isClickable, list.get(0).getHeight()); 
    } 

    @Override 
    public void onBindViewHolder(ListItemViewHolder holder, int position) { 
     final RecyclerItemModel recyclerItem = list.get(position); 

     if (recyclerItem.isBackgroundColorSpecified()) 
      holder.itemView.setBackgroundResource(recyclerItem.getBackgroundColorResource()); 
     else { 
      final int[] backgroundColors = Preferences.backgroundSelectorsGrey; 
      holder.itemView.setBackgroundResource(backgroundColors[position % backgroundColors.length]); 
     } 

     holder.textMain.setText(recyclerItem.getTextMain()); 

     if (recyclerItem.isImageRightAvailable()) { 
      if (recyclerItem.isProgressBarAvailable()) 
       if (recyclerItem.shouldShowDoneImage()) 
        setDrawableFromSVG(holder.imageRight, recyclerItem.getImageRightResourceDone()); 
       else 
        setDrawableFromSVG(holder.imageRight, recyclerItem.getImageRightResource()); 
     } else 
      holder.imageRight.setVisibility(View.GONE); 

     if (recyclerItem.isTextMainBottomAvailable()) 
      holder.textMainBottom.setText(recyclerItem.getTextMainBottom()); 
     else 
      holder.textMainBottom.setVisibility(View.GONE); 

     if (recyclerItem.isTextRightTopAvailable()) 
      holder.textRightTop.setText(recyclerItem.getTextRightTop()); 
     else 
      holder.textRightTop.setVisibility(View.GONE); 

     if (recyclerItem.isTextRightBottomAvailable()) 
      holder.textRightBottom.setText(recyclerItem.getTextRightBottom()); 
     else 
      holder.textRightBottom.setVisibility(View.GONE); 

     if (recyclerItem.isProgressBarAvailable()) 
      holder.progressBar.setProgress(recyclerItem.getProgress()); 
     else 
      holder.progressBar.setVisibility(View.GONE); 

     setAnimation(holder.itemView, position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return list.get(position).hashCode(); 
    } 

    @Override 
    public int getItemCount() { 
     return list.size(); 
    } 

    private void setAnimation(View viewToAnimate, int position) { 
     if (position > lastPosition) { 
      Animation animation = AnimationUtils.loadAnimation(context, R.anim.appear); 
      viewToAnimate.startAnimation(animation); 
      lastPosition = position; 
     } 
    } 

    public Drawable setDrawableFromSVG(ImageView imageView, int resource) { 
     SVG svg = new SVGBuilder() 
       .readFromResource(context.getResources(), resource) 
       .build(); 
     imageView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 
     imageView.setImageDrawable(svg.getDrawable()); 
     return svg.getDrawable(); 
    } 

    public final static class ListItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
     OnRecyclerViewItemClickListener onRecyclerViewItemClickListener; 
     TextView textMain, textMainBottom, textRightTop, textRightBottom; 
     ImageView imageRight; 
     ProgressBar progressBar; 
     View itemView; 

     public ListItemViewHolder(View itemView, OnRecyclerViewItemClickListener onRecyclerViewItemClickListener, 
            boolean isClickable, int height) { 
      super(itemView); 
      this.itemView = itemView; 
      this.onRecyclerViewItemClickListener = onRecyclerViewItemClickListener; 

      textMain = (TextView) itemView.findViewById(R.id.list_item_text_main); 
      imageRight = (ImageView) itemView.findViewById(R.id.list_item_image_right); 
      textRightTop = (TextView) itemView.findViewById(R.id.list_item_text_right_top); 
      textRightBottom = (TextView) itemView.findViewById(R.id.list_item_text_right_bottom); 
      textMainBottom = (TextView) itemView.findViewById(R.id.list_item_text_main_bottom); 
      progressBar = (ProgressBar) itemView.findViewById(R.id.list_item_progress_bar); 

      switch (height) { 
       case RecyclerItemModel.HEIGHT_FULL: 
         itemView.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, Preferences.squareLength)); 
        break; 
       case RecyclerItemModel.HEIGHT_HALF: 
         itemView.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, Preferences.squareLength/2)); 
      } 

      if (isClickable) 
       itemView.setOnClickListener(this); 
     } 

     @Override 
     public void onClick(View v) { 
      onRecyclerViewItemClickListener.onRecyclerViewItemClick(getPosition()); 
     } 
    } 
} 
+0

Un motivo particolare per cui non si utilizza un ListView regolare per visualizzare un elenco? Aggiungi il tuo codice dell'adattatore e daremo un'occhiata. –

+0

perché ci sono troppi articoli e rende l'app lenta usare regolarmente ListView /: condividerò il mio adattatore ora – iamkaan

+0

Il supporto dovrebbe essere statico? Non ho molta esperienza con il recyclerview, ma in ListView un supporto statico causerà un comportamento imprevedibile. –

risposta

6

Ecco cosa ha risolto il mio problema:

Animazione provoca in qualche modo un problema su RecyclerView. Quindi la soluzione per me stava rimuovendo la seguente riga:

setAnimation(holder.itemView, position);

non ho provato ad aggiungere nuovamente l'animazione, ma se si ha realmente bisogno, qui è qualcosa che può essere utile: How to animate RecyclerView items when they appear.

Problemi correlati