2015-01-28 7 views
10

मैं एक लंबी सूची के लिए रीसाइक्लिंग व्यू का उपयोग कर रहा हूं और जब मैं बहुत तेज स्क्रॉल करता हूं, तो कुछ अजीब होता है। दो समस्याएं हैं।रीसाइक्लिंग स्क्रॉल करते समय कुछ अजीब होता है

सबसे पहले नीचे दी गई छवि में से एक है। वस्तुओं में से एक (जैसे छवि में लाल सीमा वाले) स्क्रीन के कुछ यादृच्छिक भाग पर चिपक जाती है और अन्य वस्तुओं को अवरुद्ध करती है। यह गायब हो जाता है जब उस आइटम का वास्तविक संस्करण स्क्रीन पर दिखाई देता है।

screenshot

इस लंबी RecyclerView बहुत तेजी से स्क्रॉल के बारे में एक और समस्या onClick प्रभाव चिपके हुए है। कुछ आइटम दिखाई दे रहे हैं जैसे कि कोई उन पर दबाव डाल रहा है।

क्या मेरे एडाप्टर के बारे में ये समस्याएं हैं या क्या वे RecyclerView के बारे में सामान्य समस्याएं हैं?

Animating किसी भी तरह 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

कोई विशेष कारण आप एक सूची प्रदर्शित करने के लिए नियमित सूची दृश्य का उपयोग नहीं कर रहे हैं? अपना एडाप्टर कोड जोड़ें और हम एक नज़र डालेंगे। –

+0

क्योंकि बहुत सारे आइटम हैं और यह ऐप को नियमित सूची दृश्य का उपयोग करने में धीमा कर देता है /: मैं अब अपना एडाप्टर साझा करूंगा – iamkaan

+0

क्या धारक स्थिर होना चाहिए? मैं अपने आप को पुनर्नवीनीकरण के साथ बहुत अनुभवी नहीं हूं लेकिन ListView में एक स्थिर धारक अप्रत्याशित व्यवहार का कारण बन जाएगा। –

उत्तर

6

यहाँ मेरी समस्या हल हो गई है: यहाँ मेरी अनुकूलक है। इसलिए मेरे लिए समाधान निम्न पंक्ति को हटाने गया था:

setAnimation(holder.itemView, position);

मैं एनीमेशन फिर से जोड़ने की कोशिश नहीं की है, लेकिन अगर तुम सच में इसकी जरूरत है, यहाँ कुछ है कि उपयोगी हो सकता है है: How to animate RecyclerView items when they appear

संबंधित मुद्दे

 संबंधित मुद्दे