2015-01-28 14 views
10

Ich benutze RecyclerView für eine lange Liste und wenn ich zu schnell blättern, passiert etwas seltsames. Es gibt zwei Probleme.etwas komisches geschieht beim Scrollen RecyclerView zu schnell

Die erste ist die in der Abbildung unten. Einer der Gegenstände (wie der rot umrandete im Bild) klebt auf einem beliebigen Teil des Bildschirms und blockiert andere Gegenstände. Es verschwindet, wenn die reale Version dieses Elements auf dem Bildschirm sichtbar wird.

screenshot

Ein weiteres Problem, über das lange RecyclerView zu schnell Scrollen klebt onClick Wirkung. Einige Gegenstände werden sichtbar, als würde jemand auf sie drücken.

Sind diese Probleme über meinen Adapter oder sind sie häufige Probleme mit RecyclerView? Hier ist mein Adapter:

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

Gibt es einen besonderen Grund, warum Sie keine normale ListView verwenden, um eine Liste anzuzeigen? Fügen Sie Ihren Adaptercode hinzu und wir schauen uns das an. –

+0

weil es zu viele Elemente gibt und es die App langsam macht, reguläres ListView/zu verwenden: ich teile meinen Adapter jetzt – iamkaan

+0

Soll der Holder statisch sein? Ich bin nicht sehr erfahren mit recyclerview selbst, aber in ListView wird ein statischer Halter unvorhersehbares Verhalten verursachen. –

Antwort

6

Hier ist, was mein Problem gelöst:

Animieren verursacht irgendwie ein Problem auf RecyclerView. So ist die Lösung für mich war das Entfernen Sie die folgende Zeile:

setAnimation(holder.itemView, position);

Ich versuche nicht Animation wieder hinzufügen, aber wenn Sie es wirklich brauchen, hier ist etwas, das nützlich sein kann: How to animate RecyclerView items when they appear.

Verwandte Themen