2015-10-22 22 views
11

मैं RecyclerView में 400x200 छवियों को लोड कर रहा हूँ laggy है, लेकिन स्क्रॉल 2k उपकरणों पर laggy है। मैं संसाधन से छवियों को लोड करने के लिए पिकासो का उपयोग कर रहा हूं।RecyclerView स्क्रॉल

आप डेमो छवियों में देख सकते हैं 2k स्क्रीन पर धुँधली कर रहे हैं, लेकिन अगर मैं उच्च संकल्प छवियों को लोड स्थिति खराब हो जाता है। इसे कैसे ठीक करें, मैं बड़ी छवि भी लोड नहीं कर रहा हूं, इसकी 400x200?

Demo

यहाँ मेरी कोड है Card_view.xml

<?xml version="1.0" encoding="utf-8"?> 
 
<android.support.v7.widget.CardView 
 
    xmlns:android="http://schemas.android.com/apk/res/android" 
 
    xmlns:card_view="http://schemas.android.com/apk/res-auto" 
 
    android:id="@+id/card_view" 
 
    card_view:cardPreventCornerOverlap="false" 
 
    android:layout_width="fill_parent" 
 
    android:layout_height="wrap_content" 
 
    android:layout_margin="8dp" 
 
    card_view:cardCornerRadius="2dp" 
 
    > 
 

 
    <LinearLayout 
 

 
     android:layout_width="fill_parent" 
 
     android:layout_height="wrap_content" 
 
     android:orientation="vertical" 
 

 
     android:id="@+id/rel" 
 
     > 
 
     <ImageView 
 
      android:id="@+id/cardimage" 
 
      android:layout_width="match_parent" 
 
      android:layout_height="wrap_content" 
 
      android:scaleType="fitXY" 
 
      android:src="@drawable/p7" 
 
      /> 
 

 
     <TextView 
 
      android:layout_width="wrap_content" 
 
      android:layout_height="wrap_content" 
 
      android:text="title" 
 
      android:paddingLeft="16dp" 
 
      android:paddingRight="16dp" 
 
      android:paddingTop="16dp" 
 

 
      android:paddingBottom="24dp" 
 
      android:textStyle="bold" 
 
      android:textSize="24sp" 
 
      android:id="@+id/cardtitle" 
 
      android:layout_gravity="center_vertical" 
 
      /> 
 

 
    </LinearLayout> 
 

 
</android.support.v7.widget.CardView>

Myadapter कोड

public class CardAdapter extends RecyclerView.Adapter<CardAdapter.ViewHolder> { 

private Context mContext; 
List<Flower> list = new ArrayList<>(); 

public CardAdapter(Context mContext, List<Flower> list) { 
    this.mContext = mContext; 
    this.list = list; 

} 

@Override 
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

    View itemView = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.card_view, parent, false); 
    return new ViewHolder(itemView); 
} 

@Override 
public void onBindViewHolder(ViewHolder holder, int position) { 

    holder.Flower=getItem(position); 
    holder.cardtitle.setText(list.get(position).name); 

    Picasso.with(mContext) 
      .load(list.get(position).id) 
      .placeholder(R.drawable.ic_launcher) 
      .into(holder.cardimage); 
} 

@Override 
public void onAttachedToRecyclerView(RecyclerView recyclerView) { 
    super.onAttachedToRecyclerView(recyclerView); 
} 

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

public Flower getItem(int i) { 
    return list.get(i); 
} 

public class ViewHolder extends RecyclerView.ViewHolder { 

    ImageView cardimage; 
    TextView cardtitle; 
    Flower Flower; 

    public ViewHolder(View itemView) { 
     super(itemView); 

     cardimage = (ImageView) itemView.findViewById(R.id.cardimage); 
     cardtitle = (TextView) itemView.findViewById(R.id.cardtitle); 
    } 
} 
} 

अद्यतन: मैं संसाधन से छवियों को लोड कर रहा हूँ, मैं नहीं कर रहा हूँ डाउनलोड कुछ भी नहीं

यहाँ मेरी सरणी है

private void initializeData() { 
    flowers = new ArrayList<>(); 
    flowers.add(new Flower("Flower 1", R.drawable.p8)); 
    flowers.add(new Flower("Flower 2", R.drawable.p10)); 
    flowers.add(new Flower("Flower 3", R.drawable.p11)); 
    flowers.add(new Flower("Flower 4", R.drawable.p8)); 
    flowers.add(new Flower("Flower 5", R.drawable.photo2)); 
    flowers.add(new Flower("Flower 6", R.drawable.photo6)); 
    flowers.add(new Flower("Flower 7", R.drawable.p12)); 
    flowers.add(new Flower("Flower 8", R.drawable.p9)); 
    flowers.add(new Flower("Flower 9", R.drawable.p8)); 
    flowers.add(new Flower("Flower 10", R.drawable.p8)); 
    flowers.add(new Flower("Flower 11", R.drawable.p8)); 
    flowers.add(new Flower("Flower 12", R.drawable.p10)); 
} 

अद्यतन 2: दोस्तों मैं adapter.setHasStableIds (सही) की स्थापना करके अंतराल के सबसे तय, लेकिन एप्लिकेशन जबकि छवियों अभी तक लोड नहीं कर रहे हैं अभी भी पहले स्क्रॉल पर laggy है , इसे कैसे ठीक करें?

अद्यतन 3: मैं सिर्फ वेब से चित्र लोड करने की कोशिश की और सब कुछ चिकनी लगता है, शायद वहाँ संसाधन से लोड हो रहा है छवियों के साथ कुछ समस्या है।

ठीक है, तुम लोगों को धन्यवाद, मैं वेब से मेरी छवियों को लोड कर रहा हूँ।

+0

क्या स्क्रॉल करते समय ही यह अंतराल होता है ?? या यह ऊपर और नीचे स्क्रॉलिंग दोनों के लिए अंतराल करता है? –

+0

@ लुकास क्रॉफर्ड केवल स्क्रॉल करते समय इसकी लापरवाही। संपादित करें: इसकी छवियों को ऊपर और नीचे, एक बार जब छवियों को लोड किया जाता है तो वहां कम अंतराल होता है लेकिन यह अभी भी वहां है। –

+0

क्या आपको इसके लिए समाधान मिला ?? –

उत्तर

2

आपको छवियों को असंकालिक रूप से प्राप्त करने की आवश्यकता है। जैसा कि अब है, यह वास्तव में छवि को डाउनलोड करने के लिए स्टाल करता है।

कब बनाया जाता है imageView खाली छोड़ दें, लेकिन जब यह डाउनलोड किया गया है छवि स्थापित करने के लिए श्रोता के कुछ प्रकार की है।

+1

मैं छवियों को डाउनलोड नहीं कर रहा हूं, मैं संसाधन से छवि सेट कर रहा हूं। –

-2

मुझे लगता है कि कारण यह है कि पिकासो अपनी छवियों को कैश है, लेकिन जब से तुम ड्रॉएबल है कि आप अपने अनुप्रयोग के साथ एक साथ बंडल की एक सूची है, तो आप सिद्धांत में अपनी इमेज को कैश करने की जरूरत नहीं है। कैशिंग केवल तब उपयोगी होती है जब आप इंटरनेट से छवि डाउनलोड कर रहे होते हैं और आप नहीं चाहते हैं कि जब भी आप रीसाइक्लिंग व्यू पर ऊपर या नीचे स्वाइप करें तो ऐप छवियों को फिर से लोड करें।

मैं memorypolicy बदलकर रास्ता पिकासो काम करता है समायोजित तो यह बजाय कोशिश करेंगे:

Picasso.with(getContext()).load(data.get(pos).getFeed_thumb_image()).memoryPolicy(MemoryPolicy.NO_CACHE).into(image); 
+0

धन्यवाद, लेकिन कैशिंग की स्थिति के बिना भी बदतर है। मैंने पाया कि जब सभी छवियों को लोड किया जाता है तो आकार बदलने के लिए एक बार बेहतर हो जाता है, लेकिन फिर भी पहली बार स्क्रॉल करते समय अंतराल हो जाता है। लेकिन सेटिंग फिक्स आकार मेरे मामले में काम नहीं करता है क्योंकि मैं छवि को कार्ड की लहर भरना चाहता हूं। –

+0

यदि ड्रायबल शामिल हैं स्मृति में हैं या नहीं सवाल है। यदि आप RecyclerView के दौरान ड्रॉबल्स लोड करते हैं तो यह हिचकिचाहट पैदा करेगा। RecyclerView शुरू होने से पहले ड्रॉबल्स को मेमोरी में लोड करने की आवश्यकता है। रीसाइक्लर व्यू शुरू होने से पहले सभी गैर-शामिल ड्रॉबल को कैश करने की आवश्यकता हो सकती है। मुझे यकीन नहीं है कि रीसाइक्लर व्यू (या आपके द्वारा उपयोग किए जाने वाले कुछ अन्य भाग) यूआई थ्रेड या बीजी थ्रेड का उपयोग कर रहे हैं या नहीं। यदि यह पहले से ही बीजी थ्रेड का उपयोग कर रहा है तो आपको यह सुनिश्चित करने की आवश्यकता हो सकती है कि वे प्रतिस्पर्धा नहीं कर रहे हैं – CmosBattery

+2

यहां प्रोजेक्ट https://drive.google.com/file/d/0BypaioeS7MXPNHY3ZUFiNVBtcTg/view?usp=sharing का डेमो है। मैं पिकासो के साथ ड्रॉबल्स लोड कर रहा हूं, मैं रीसायकल व्यू से पहले उन्हें कैसे लोड कर सकता हूं? मैंने प्रारंभ करने के बाद प्रारंभिकडेटा() विधि को कॉल करने का प्रयास किया, लेकिन पहली स्क्रॉल पर स्टिल अंतराल है। याद रखें, यह केवल 2k रिज़ॉल्यूशन पर हैपेंस करता है। पूर्ण एचडी पर सब कुछ चिकनी है। –

8

RecyclerView.setHasFixedSize() सही पर सेट किया जाता है? मैं इस अंतराल को पुन: उत्पन्न करने में सक्षम नहीं हूं ... क्या आप पूरी परियोजना को गिट पर पोस्ट कर सकते हैं? इस की जाँच करें, हो सकता है यह आपकी मदद कर सकते हैं: http://antonioleiva.com/recyclerview/

+0

हाँ सच है। एंड्रॉइड स्टूडियो प्रोजेक्ट यहां है। https://drive.google.com/file/d/0BypaioeS7MXPNHY3ZUFiNVBtcTg/view?usp=sharing –

+1

मैं एक जीनमोशन वीएम का उपयोग कर रहा हूं और मैं अंतराल को पुन: उत्पन्न नहीं कर सकता। मैं 3 संभव सुधार किया है: activity_main.xml में 1., RecyclerView.layout_height करने के लिए "match_parent" बदलने 2., केवल अपने drawable फ़ोल्डर में PNG का उपयोग करते हुए के रूप में वे तेजी से 3. सेट adapter.setHasStableIds को संपीड़ित (सही) की कोशिश करें; और कार्ड एडाप्टर में जोड़ें: '@ ओवरराइड सार्वजनिक लंबी getItemId (int स्थिति) { वापसी की स्थिति; } ' –

+0

आपको बहुत धन्यवाद, जो कि अधिकांश अंतराल को तय करता है। अब ऐप केवल पहली स्क्रॉल पर लगी है जब छवियां अभी भी लोड नहीं होती हैं। एक बार जब छवियों को लोड किया जाता है तो सबकुछ चिकना होता है। इस बारे में कोई विचार? क्या आप 2k रिज़ॉल्यूशन पर एमुलेटर चला रहे हैं, n6 या n6p चलाने का प्रयास करें। यह केवल 2k संकल्प पर लगी है। –

2

अगर आप ऊर्ध्वाधर मोड में Recyclerview का उपयोग करें और अपनी गतिविधि अन्य आइटम आप ScrollView है कि होता है तो आप NestedScrollView बजाय ScrollView उपयोग करना चाहिए।

जैसा कि Google दस्तावेज़ में वर्णित है NestedScrollView स्क्रॉलव्यू की तरह है, लेकिन यह एंड्रॉइड के नए और पुराने दोनों संस्करणों पर नेस्टेड स्क्रॉलिंग पैरेंट और बच्चे दोनों के रूप में अभिनय का समर्थन करता है। नेस्टेड स्क्रॉलिंग डिफ़ॉल्ट रूप से सक्षम है।

+1

क्या होगा यदि एकाधिक रीसाइक्लिंग दृश्य स्क्रॉलव्यू के अंदर हैं? एकाधिक रीसाइक्लिंग दृश्यों के लिए –

+0

आपको स्क्रॉलिंग – MSH

11

अगर आप (RecyclerView और NestedView) की तरह दो या अधिक recycler विचारों का उपयोग कर रहे इस

recyclerView.setNestedScrollingEnabled(false);

स्रोत की कोशिश: मैं laggy recyclerView मुद्दा था Recyclerview inside Nested Scrollview scroll but does not fast scroll like normal Recyclerview or Nested Scrollview

+1

को संभालने के लिए "NestedScrollView" का भी उपयोग करना होगा, यह सुनिश्चित नहीं है कि मेरी समस्या मूल पोस्टर के समान ही है, लेकिन यह ठीक है मेरा यहां तय किया गया है। – Larpus

+0

यह मेरे लिए भी वही था, और खोज ने मुझे यहां ले जाया ताकि जब मुझे मेरा जवाब मिल गया तो मुझे इसे यहां पोस्ट करना पसंद आया –

1

जब भीतर TextView में से एक recyclerView शून्य मान प्राप्त कर रहा था। मैं इसे ठीक करता हूं और मेरा रीसाइक्लर व्यू लग रहा है।

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