Android RecyclerView ประสิทธิภาพการเลื่อน


88

ฉันได้สร้างตัวอย่าง RecyclerView ตามคำแนะนำการสร้างรายการและการ์ด อะแดปเตอร์ของฉันมีการใช้รูปแบบเพื่อขยายเลย์เอาต์เท่านั้น

ปัญหาคือประสิทธิภาพการเลื่อนไม่ดี สิ่งนี้ใน RecycleView ที่มีเพียง 8 รายการ

ในการทดสอบบางอย่างฉันยืนยันว่าใน Android L ปัญหานี้ไม่เกิดขึ้น แต่ในเวอร์ชัน KitKat ประสิทธิภาพลดลงอย่างเห็นได้ชัด


1
ลองใช้รูปแบบการออกแบบ ViewHolder ในการเลื่อนประสิทธิภาพ: developer.android.com/training/improving-layouts/…
Haresh Chhelana

@HareshChhelana ขอบคุณสำหรับคำตอบ! แต่ฉันใช้รูปแบบ ViewHolder อยู่แล้วตามลิงค์: developer.android.com/training/material/lists-cards.html
falvojr

2
คุณสามารถแบ่งปันรหัสเกี่ยวกับการตั้งค่าอะแดปเตอร์และไฟล์ XML สำหรับโครงร่างของคุณได้ไหม สิ่งนี้ดูไม่ปกติ นอกจากนี้คุณได้ทำโปรไฟล์และดูว่าเวลาที่ใช้ไปคืออะไร?
yigit

2
ฉันกำลังเผชิญกับปัญหาเดียวกันเกือบทั้งหมด ยกเว้นมันเร็วในก่อน Lollipop และช้าอย่างไม่น่าเชื่อใน Android L.
Servus7

1
คุณยังสามารถแชร์เวอร์ชันของไลบรารีที่คุณกำลังนำเข้าได้
Droidekas

คำตอบ:


231

ฉันเพิ่งประสบปัญหาเดียวกันดังนั้นนี่คือสิ่งที่ฉันได้ทำกับไลบรารีสนับสนุน RecyclerView ล่าสุด:

  1. แทนที่เค้าโครงที่ซับซ้อน (มุมมองที่ซ้อนกัน, RelativeLayout) ด้วย ConstraintLayout ที่ปรับให้เหมาะสมใหม่ เปิดใช้งานใน Android Studio: ไปที่ SDK Manager -> แท็บ SDK Tools -> Support Repository -> ตรวจสอบ ConstraintLayout สำหรับ Android & Solver สำหรับ ConstraintLayout เพิ่มการอ้างอิง:

    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    
  2. ถ้าเป็นไปได้ให้องค์ประกอบทั้งหมดของ RecyclerView ที่มีความสูงเดียวกัน และเพิ่ม:

    recyclerView.setHasFixedSize(true);
    
  3. ใช้วิธีแคชการวาด RecyclerView เริ่มต้นและปรับแต่งตามกรณีของคุณ คุณไม่จำเป็นต้องใช้ไลบรารีของบุคคลที่สามในการดำเนินการ:

    recyclerView.setItemViewCacheSize(20);
    recyclerView.setDrawingCacheEnabled(true);
    recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
    
  4. ถ้าคุณใช้หลายภาพให้แน่ใจว่าพวกเขาขนาดและการบีบอัดที่ดีที่สุด การปรับขนาดภาพอาจส่งผลต่อประสิทธิภาพด้วย ปัญหามีสองด้านคือภาพต้นฉบับที่ใช้และ Bitmap ที่ถอดรหัสแล้ว ตัวอย่างต่อไปนี้จะให้คำแนะนำเกี่ยวกับวิธีการถอดรหัสและรูปภาพที่ดาวน์โหลดจากเว็บ:

    InputStream is = (InputStream) url.getContent();
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inPreferredConfig = Bitmap.Config.RGB_565;
    Bitmap image = BitmapFactory.decodeStream(is, null, options);
    

ส่วนที่สำคัญที่สุดคือการระบุinPreferredConfig- กำหนดจำนวนไบต์ที่จะใช้สำหรับแต่ละพิกเซลของภาพ โปรดทราบว่านี่เป็นตัวเลือกที่ต้องการ หากอิมเมจต้นฉบับมีสีมากกว่านั้นจะยังคงถูกถอดรหัสด้วยการกำหนดค่าที่แตกต่างกัน

  1. ตรวจสอบให้แน่ใจว่าonBindViewHolder ()มีราคาถูกที่สุด คุณสามารถตั้งค่า OnClickListener ได้ครั้งเดียวonCreateViewHolder()และโทรผ่านอินเทอร์เฟซของผู้ฟังที่อยู่นอกอะแดปเตอร์ผ่านรายการที่คลิก วิธีนี้จะทำให้คุณไม่ต้องสร้างวัตถุพิเศษตลอดเวลา ตรวจสอบค่าสถานะและสถานะก่อนทำการเปลี่ยนแปลงใด ๆ กับมุมมองที่นี่

    viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
              Item item = getItem(getAdapterPosition());
              outsideClickListener.onItemClicked(item);
          }
    });
    
  2. เมื่อข้อมูลที่ได้รับการเปลี่ยนแปลงพยายามที่จะปรับปรุงเฉพาะรายการที่ได้รับผลกระทบ ตัวอย่างเช่นแทนที่จะทำให้ข้อมูลทั้งชุดเป็นโมฆะnotifyDataSetChanged()เมื่อเพิ่ม / โหลดรายการเพิ่มเติมให้ใช้:

    adapter.notifyItemRangeInserted(rangeStart, rangeEnd);
    adapter.notifyItemRemoved(position);
    adapter.notifyItemChanged(position);
    adapter.notifyItemInserted(position);
    
  3. จากเว็บไซต์นักพัฒนา Android :

ใช้ informDataSetChanged () เป็นทางเลือกสุดท้าย

แต่ถ้าคุณจำเป็นต้องใช้ให้ดูแลไอเท็มของคุณด้วยรหัสเฉพาะ :

    adapter.setHasStableIds(true);

RecyclerView จะพยายามสังเคราะห์เหตุการณ์การเปลี่ยนแปลงโครงสร้างที่มองเห็นได้สำหรับอะแด็ปเตอร์ที่รายงานว่ามี ID ที่เสถียรเมื่อใช้วิธีนี้ สิ่งนี้สามารถช่วยสำหรับวัตถุประสงค์ของการคงอยู่ของภาพเคลื่อนไหวและภาพวัตถุ แต่การดูรายการแต่ละรายการจะยังคงต้องมีการตอบกลับและจ่ายใหม่

แม้ว่าคุณจะทำทุกอย่างถูกต้อง แต่ก็มีโอกาสที่ RecyclerView จะยังทำงานได้ไม่ราบรื่นเท่าที่คุณต้องการ


20
หนึ่งคะแนนสำหรับ adapter.setHasStableIds (true); วิธีการที่ช่วยให้การรีไซเคิลดูรวดเร็วขึ้น
Atula

1
ภาค 7 ผิดเต็ม ๆ ! setHasStableIds (true) จะไม่ทำอะไรเลยนอกจากคุณใช้ adapter.notifyDataSetChanged () Link: developer.android.com/reference/android/support/v7/widget/…
localhost

1
ฉันเห็นว่าเหตุใดจึงrecyclerView.setItemViewCacheSize(20);สามารถกระตุ้นประสิทธิภาพได้ แต่recyclerView.setDrawingCacheEnabled(true);และrecyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);แม้ว่า! ฉันไม่แน่ใจว่าสิ่งเหล่านี้จะเปลี่ยนแปลงอะไร นี่คือการViewเรียกเฉพาะที่ช่วยให้คุณดึงแคชการวาดภาพโดยใช้โปรแกรมเป็นบิตแมปและใช้เพื่อประโยชน์ของคุณในภายหลัง RecyclerViewดูเหมือนจะไม่ได้ทำอะไรกับมัน
Abdelhakim AKODADI

2
@AbdelhakimAkodadi การเลื่อนจะราบรื่นด้วยแคช ฉันได้ทดสอบแล้ว คุณจะพูดอย่างอื่นได้อย่างไรมันชัดเจน แน่นอนว่าถ้ามีคนเลื่อนอย่างบ้าคลั่งจะไม่มีอะไรช่วยได้ ฉันแค่แสดงตัวเลือกอื่น ๆ เช่น setDrawingCacheQuality ซึ่งฉันไม่ได้ใช้เพราะคุณภาพของภาพเป็นสิ่งสำคัญในกรณีของฉัน ฉันไม่ได้สั่งสอน DRAWING_CACHE_QUALI‌ TY_HIGH แต่ขอแนะนำให้ใครก็ตามที่สนใจเจาะลึกและปรับแต่งตัวเลือกนี้
Galya

2
setDrawingCacheEnabled () และ setDrawingCacheQuality () เลิกใช้แล้ว ใช้การเร่งฮาร์ดแวร์แทน developer.android.com/reference/android/view/…
Shayan_Aryan

14

ฉันแก้ไขปัญหานี้โดยเพิ่มค่าสถานะต่อไปนี้:

https://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter.html#setHasStableIds(boolean)


2
สิ่งนี้ทำให้ประสิทธิภาพการทำงานดีขึ้นเล็กน้อยสำหรับฉัน แต่ RecyclerView ยังคงเป็นสุนัขที่ตายช้า - ช้ากว่า ListView แบบกำหนดเองที่เทียบเท่ากันมาก
SMBiggs

อ่า แต่ฉันค้นพบว่าทำไมโค้ดของฉันถึงช้ามาก - มันไม่เกี่ยวอะไรกับ setHasStableIds () ฉันจะโพสต์คำตอบพร้อมข้อมูลเพิ่มเติม
SMBiggs

13

ฉันค้นพบอย่างน้อยหนึ่งรูปแบบที่สามารถฆ่าประสิทธิภาพของคุณได้ จำไว้ว่าonBindViewHolder()เรียกบ่อยบ่อยดังนั้นทุกสิ่งที่คุณทำในโค้ดนั้นมีโอกาสที่จะหยุดการแสดงของคุณได้ หาก RecyclerView ของคุณทำการปรับแต่งใด ๆ มันง่ายมากที่จะใส่โค้ดที่ช้าลงในวิธีนี้โดยไม่ได้ตั้งใจ

ฉันกำลังเปลี่ยนภาพพื้นหลังของ RecyclerView แต่ละตัวขึ้นอยู่กับตำแหน่ง แต่การโหลดรูปภาพใช้เวลาทำงานเล็กน้อยทำให้ RecyclerView ของฉันอืดและกระตุก

การสร้างแคชสำหรับรูปภาพนั้นเป็นสิ่งมหัศจรรย์ onBindViewHolder()ตอนนี้เพียงแค่ปรับเปลี่ยนการอ้างอิงไปยังรูปภาพแคชแทนที่จะโหลดใหม่ตั้งแต่ต้น ตอนนี้ซิป RecyclerView พร้อม

ฉันรู้ว่าไม่ใช่ทุกคนที่จะมีปัญหานี้แน่นอนดังนั้นฉันจึงไม่ต้องกังวลกับการโหลดโค้ด แต่โปรดพิจารณางานที่ทำในonBindViewHolder()ฐานะคอขวดที่มีศักยภาพสำหรับประสิทธิภาพการทำงานของ RecyclerView ที่ไม่ดี


ฉันมีปัญหาเดียวกัน ตอนนี้ฉันใช้ Fresco ในการโหลดรูปภาพและแคช คุณมีวิธีอื่นที่ดีกว่าในการโหลดและแคชรูปภาพภายใน RecyclerView ขอบคุณ.
Androidicus

ฉันไม่คุ้นเคยกับ Fresco (อ่าน ... คำสัญญาของพวกเขาเป็นสิ่งที่ดี) บางทีพวกเขาอาจมีข้อมูลเชิงลึกเกี่ยวกับวิธีใช้แคชกับ RecyclerViews ให้ดีที่สุด และผมเห็นคุณไม่ใช่คนเดียวกับปัญหานี้: github.com/facebook/fresco/issues/414
SMBiggs

10

นอกเหนือจากคำตอบโดยละเอียดของ @ Galya แล้วฉันต้องการระบุว่าแม้ว่ามันอาจจะเป็นปัญหาในการเพิ่มประสิทธิภาพ แต่ก็เป็นความจริงเช่นกันที่การเปิดใช้งานดีบักเกอร์สามารถทำให้สิ่งต่างๆช้าลงได้มาก

หากคุณทำทุกอย่างเพื่อเพิ่มประสิทธิภาพของคุณRecyclerViewแล้ว แต่มันก็ยังทำงานไม่ราบรื่นให้ลองเปลี่ยนตัวแปรreleaseบิวด์ของคุณเป็นและตรวจสอบว่ามันทำงานอย่างไรในสภาพแวดล้อมที่ไม่ใช่การพัฒนา (โดยปิดใช้ดีบักเกอร์)

เกิดขึ้นกับฉันที่แอปของฉันทำงานช้าในdebugเวอร์ชันบิวด์ แต่ทันทีที่ฉันเปลี่ยนไปใช้releaseเวอร์ชันนั้นก็ทำงานได้อย่างราบรื่น นี่ไม่ได้หมายความว่าคุณควรพัฒนาด้วยreleaseเวอร์ชันบิวด์ แต่เป็นการดีที่จะทราบว่าเมื่อใดก็ตามที่คุณพร้อมที่จะจัดส่งแอปของคุณแอปจะทำงานได้ดี


ความคิดเห็นนี้มีประโยชน์มากสำหรับฉัน! ฉันได้ลองทุกอย่างเพื่อปรับปรุงประสิทธิภาพของ Recyclerview แล้ว แต่ก็ไม่มีอะไรช่วยได้จริงๆ แต่เมื่อฉันเปลี่ยนไปใช้รุ่นรีลีสฉันก็รู้ว่าทุกอย่างเรียบร้อยดี
Tal Barda

1
ฉันประสบปัญหาเดียวกันแม้ว่าจะไม่ได้ติดดีบักเกอร์ แต่ทันทีที่ย้ายไปปล่อย
บิล

8

ฉันได้พูดคุยเกี่ยวกับRecyclerViewการแสดงของ นี่คือภาพนิ่งในภาษาอังกฤษและวิดีโอที่บันทึกไว้ในรัสเซีย

มันมีชุดเทคนิค (บางส่วนมีคำตอบของ @ Daryaอยู่แล้ว)

สรุปโดยย่อมีดังนี้

  • หากAdapterรายการมีขนาดคงที่ให้ตั้งค่า:
    recyclerView.setHasFixedSize(true);

  • หากเอนทิตีข้อมูลสามารถแสดงด้วย long ( hashCode()เช่น) ให้ตั้งค่า:
    adapter.hasStableIds(true);
    และใช้:
    // YourAdapter.java
    @Override
    public long getItemId(int position) {
    return items.get(position).hashcode(); //id()
    }
    ในกรณีนี้Item.id()จะไม่ได้ผลเพราะจะยังคงเหมือนเดิมแม้ว่าItemเนื้อหาจะเปลี่ยนไปก็ตาม
    ปล. สิ่งนี้ไม่จำเป็นถ้าคุณใช้ DiffUtil!

  • ใช้บิตแมปที่ปรับขนาดอย่างถูกต้อง อย่าสร้างวงล้อใหม่และใช้ไลบรารี
    ข้อมูลเพิ่มเติมวิธีการเลือกที่นี่

  • ใช้เวอร์ชันล่าสุดของRecyclerView. ตัวอย่างเช่นมีการปรับปรุงประสิทธิภาพอย่างมากใน25.1.0- การดึงข้อมูลล่วงหน้า
    ข้อมูลเพิ่มเติมที่นี่

  • ใช้ DiffUtill
    DiffUtil เป็นต้อง เอกสารอย่างเป็นทางการ

  • ลดความซับซ้อนของรูปแบบรายการของคุณ!
    ไลบรารีขนาดเล็กเพื่อเพิ่ม TextViews - TextViewRichDrawable

ดูสไลด์สำหรับคำอธิบายโดยละเอียดเพิ่มเติม


7

ฉันไม่แน่ใจจริงๆว่าการใช้setHasStableIdแฟล็กจะช่วยแก้ปัญหาของคุณได้หรือไม่ จากข้อมูลที่คุณระบุปัญหาประสิทธิภาพอาจเกี่ยวข้องกับปัญหาหน่วยความจำ ประสิทธิภาพแอปพลิเคชันของคุณในแง่ของอินเทอร์เฟซผู้ใช้และหน่วยความจำค่อนข้างเกี่ยวข้องกัน

เมื่อสัปดาห์ที่แล้วฉันพบว่าแอปของฉันมีหน่วยความจำรั่ว ฉันค้นพบสิ่งนี้เพราะหลังจากใช้แอปไป 20 นาทีฉันสังเกตเห็นว่า UI ทำงานช้ามาก การปิด / เปิดกิจกรรมหรือการเลื่อน RecyclerView พร้อมองค์ประกอบต่างๆนั้นช้ามาก หลังจากตรวจสอบผู้ใช้ของฉันในการใช้งานจริงโดยใช้http://flowup.io/ฉันพบสิ่งนี้:

ป้อนคำอธิบายภาพที่นี่

เวลาของเฟรมสูงมากและเฟรมต่อวินาทีก็ต่ำมาก คุณจะเห็นว่าบางเฟรมต้องใช้เวลาประมาณ 2 วินาทีในการเรนเดอร์: S

พยายามคิดว่าอะไรเป็นสาเหตุของเฟรมไทม์ / เฟรมต่อวินาทีที่ไม่ดีฉันพบว่าฉันมีปัญหาหน่วยความจำดังที่คุณเห็นที่นี่:

ป้อนคำอธิบายภาพที่นี่

แม้ว่าการใช้หน่วยความจำโดยเฉลี่ยจะใกล้เคียงกับ 15MB ในเวลาเดียวกันแอปก็ทิ้งเฟรม

นั่นคือวิธีที่ฉันค้นพบปัญหา UI ฉันมีหน่วยความจำรั่วไหลในแอปของฉันทำให้เกิดเหตุการณ์ตัวเก็บขยะจำนวนมากและนั่นทำให้ประสิทธิภาพของ UI ไม่ดีเนื่องจาก Android VM ต้องหยุดแอปของฉันเพื่อรวบรวมหน่วยความจำทุกๆเฟรม

เมื่อดูโค้ดฉันมีข้อมูลรั่วไหลในมุมมองที่กำหนดเองเนื่องจากฉันไม่ได้ยกเลิกการลงทะเบียนผู้ฟังจากอินสแตนซ์นักออกแบบท่าเต้นของ Android หลังจากปล่อยการแก้ไขทุกอย่างก็เป็นปกติ :)

หากแอปของคุณตกเฟรมเนื่องจากปัญหาหน่วยความจำคุณควรตรวจสอบข้อผิดพลาดทั่วไปสองประการ:

ตรวจสอบว่าแอปของคุณจัดสรรออบเจ็กต์ภายในเมธอดที่เรียกใช้หลายครั้งต่อวินาทีหรือไม่ แม้ว่าการจัดสรรนี้สามารถดำเนินการในสถานที่อื่นที่ใบสมัครของคุณเริ่มช้า ตัวอย่างอาจเป็นการสร้างอินสแตนซ์ใหม่ของอ็อบเจ็กต์ภายในเมธอดมุมมองที่กำหนดเอง onDraw บน onBindViewHolder ในตัวยึดมุมมองมุมมองรีไซเคิลของคุณ ตรวจสอบว่าแอปของคุณกำลังลงทะเบียนอินสแตนซ์ใน Android SDK แต่ไม่ได้เปิดตัว การลงทะเบียนผู้ฟังในเหตุการณ์รถบัสอาจทำให้เกิดการรั่วไหลได้

คำเตือน: เครื่องมือที่ฉันใช้ตรวจสอบแอปของฉันอยู่ระหว่างการพัฒนา ฉันสามารถเข้าถึงเครื่องมือนี้ได้เพราะฉันเป็นหนึ่งในผู้พัฒนา :) หากคุณต้องการเข้าถึงเครื่องมือนี้เราจะปล่อยเวอร์ชันเบต้าในเร็ว ๆ นี้! คุณสามารถเข้าร่วมในเว็บไซต์ของเรา: http://flowup.io/

หากคุณต้องการใช้เครื่องมือต่างๆคุณสามารถใช้: Traveview, dmtracedump, systrace หรือ Andorid Performance Monitor ที่รวมอยู่ใน Android Studio แต่โปรดจำไว้ว่าเครื่องมือนี้จะตรวจสอบอุปกรณ์ที่เชื่อมต่อของคุณไม่ใช่ส่วนที่เหลือของอุปกรณ์ผู้ใช้หรือการติดตั้งระบบปฏิบัติการ Android


3

สิ่งสำคัญคือต้องตรวจสอบเค้าโครงหลักที่คุณใส่ไว้ใน Recyclerview ของคุณ ฉันมีปัญหาในการเลื่อนที่คล้ายกันเมื่อฉันทดสอบ RecyclerView ใน Nestedscrollview มุมมองที่เลื่อนในมุมมองอื่นที่การเลื่อนอาจประสบกับประสิทธิภาพระหว่างการเลื่อน


2

ในกรณีของฉันฉันพบว่าสาเหตุของความล่าช้าที่โดดเด่นคือ drawable บ่อยโหลดภายใน#onBindViewHolder()วิธี ฉันแก้ไขได้โดยการโหลดภาพเป็นBitmapหนึ่งครั้งในViewHolderและเข้าถึงได้จากวิธีการที่กล่าวถึง นั่นคือทั้งหมดที่ฉันทำ


2

ใน RecyclerView ของฉันฉันใช้ภาพบิตแมปสำหรับพื้นหลังของ item_layout ของฉัน
ทุกสิ่งที่ @Galya พูดเป็นความจริง (และฉันขอขอบคุณเขาสำหรับคำตอบที่ยอดเยี่ยมของเขา) แต่พวกเขาไม่ได้ผลสำหรับฉัน

นี่คือสิ่งที่แก้ไขปัญหาของฉัน:

BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
Bitmap bitmap = BitmapFactory.decodeStream(stream, null, options);

สำหรับข้อมูลเพิ่มเติมโปรดอ่าน คำตอบนี้


2

ใน mycase ฉันมีเด็กรีไซเคิลที่ซับซ้อน ดังนั้นจึงส่งผลต่อเวลาในการโหลดกิจกรรม (~ 5 วินาทีสำหรับการแสดงผลกิจกรรม)

ฉันโหลดอะแดปเตอร์ด้วย postDelayed () -> สิ่งนี้จะให้ผลลัพธ์ที่ดีสำหรับการเรนเดอร์กิจกรรม หลังจากกิจกรรมแสดงภาระการรีไซเคิลของฉันดูราบรื่น

ลองคำตอบนี้

    recyclerView.postDelayed(new Runnable() {
        @Override
        public void run() {
            recyclerView.setAdapter(mAdapter);
        }
    },100); 

1

ฉันเห็นในความคิดเห็นว่าคุณกำลังใช้ViewHolderรูปแบบอยู่แล้ว แต่ฉันจะโพสต์อะแดปเตอร์ตัวอย่างที่นี่ซึ่งใช้RecyclerView.ViewHolderรูปแบบเพื่อให้คุณสามารถตรวจสอบได้ว่าคุณกำลังรวมเข้าด้วยกันในลักษณะเดียวกันอีกครั้งตัวสร้างของคุณอาจแตกต่างกันไปตามความต้องการของคุณที่นี่ เป็นตัวอย่าง:

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

    Context mContext;
    List<String> mNames;

    public RecyclerAdapter(Context context, List<String> names) {
        mContext = context;
        mNames = names;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
        View view = LayoutInflater.from(viewGroup.getContext())
                .inflate(android.R.layout.simple_list_item_1, viewGroup, false);

        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ViewHolder viewHolder, int position) {
        //Populate.
        if (mNames != null) {
            String name = mNames.get(position);

            viewHolder.name.setText(name);
        }
    }

    @Override
    public int getItemCount() {

        if (mNames != null)
            return mNames.size();
        else
            return 0;
    }

    /**
     * Static Class that holds the RecyclerView views. 
     */
    static class ViewHolder extends RecyclerView.ViewHolder {
        TextView name;

        public ViewHolder(View itemView) {
            super(itemView);
            name = (TextView) itemView.findViewById(android.R.id.text1);
        }
    }
}

หากคุณมีปัญหาในการทำงานRecyclerView.ViewHolderตรวจสอบให้แน่ใจว่าคุณมีการอ้างอิงที่เหมาะสมซึ่งคุณสามารถยืนยันได้ตลอดเวลาที่Gradle Please

หวังว่าจะช่วยแก้ปัญหาของคุณได้


1

สิ่งนี้ช่วยให้ฉันเลื่อนได้อย่างราบรื่นมากขึ้น:

แทนที่ onFailedToRecycleView (ViewHolder holder) ในอะแด็ปเตอร์

และหยุดตัวยึดภาพเคลื่อนไหวที่กำลังดำเนินอยู่ (ถ้ามี) "animateview" .clearAnimation ();

อย่าลืมกลับจริง



1

การเพิ่มคำตอบของ @ Galya ในการผูก viewHolder ฉันใช้วิธี Html.fromHtml () เห็นได้ชัดว่าสิ่งนี้มีผลกระทบต่อประสิทธิภาพ


0

ฉันแก้ไขปัญหานี้โดยใช้บรรทัดเดียวในไลบรารี Picasso

. พอดี ()

Picasso.get().load(currentItem.getArtist_image())

                    .fit()//this wil auto get the size of image and reduce it 

                    .placeholder(R.drawable.ic_doctor)
                    .into(holder.img_uploaderProfile, new Callback() {
                        @Override
                        public void onSuccess() {


                        }

                        @Override
                        public void onError(Exception e) {
                            Toast.makeText(context, "Something Happend Wrong Uploader Image", Toast.LENGTH_LONG).show();
                        }
                    });
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.