2015-01-28 1 views
10

RecyclerView를 긴 목록으로 사용하고 있습니다. 스크롤이 너무 빠르면 이상한 일이 발생합니다. 두 가지 문제가 있습니다.RecyclerView를 너무 빠르게 스크롤하는 동안 이상한 일이 발생합니다.

첫 번째 이미지는 아래 이미지입니다. 이미지 중 빨간색 테두리가있는 항목과 같은 항목 중 하나가 화면의 임의의 부분에 달라 붙어 다른 항목을 차단합니다. 해당 항목의 실제 버전이 화면에 표시되면 사라집니다.

screenshot

이 긴 RecyclerView 너무 빨리 스크롤에 대한 또 다른 문제는 온 클릭 효과를 고집한다. 다른 사람이 누르는 것처럼 보이는 항목이 있습니다.

내 어댑터에 대한 이러한 문제입니까? 또는 RecyclerView에 대한 일반적인 문제입니까?

에 애니메이션이 어떻게 든 RecyclerView에 문제가 발생합니다

여기
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

일반 ListView를 사용하여 목록을 표시하지 않는 특별한 이유가 있습니까? 어댑터 코드를 추가하면 우리가 살펴볼 것입니다. –

+0

너무 많은 항목이있어서 앱이 느리게 일반 ListView /를 사용하기 때문에 : 내 어댑터를 지금 사용하겠습니다. – iamkaan

+0

홀더가 고정적일까요? 내가 직접 recyclerview 경험이 아니지만 ListView에서 정적 홀더 예측할 수없는 동작이 발생할 것입니다. –

답변

6

내 문제를 해결할 것입니다 : 여기 내 어댑터입니다. 그래서 나를 위해 솔루션은 다음 줄을 제거했다 :

setAnimation(holder.itemView, position);

다시 애니메이션을 추가하려고하지만 당신이 정말로 필요하면, 여기에 유용 할 수 있습니다 뭔가하지 않았다 : How to animate RecyclerView items when they appear.

관련 문제