เราควรใช้ RecyclerView เพื่อแทนที่ ListView หรือไม่


232

เอกสาร Android พูดว่า:

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

ที่จริงแล้วListViewสามารถทำทุกอย่างได้ถ้าประสิทธิภาพไม่สำคัญและเราพบปัญหามากมายเมื่อเราใช้RecyclerViewเพื่อแทนที่ListView:

  1. ไม่มี onItemClickListener () สำหรับการเลือกรายการ - วิธีแก้ไข

  2. ไม่มีตัวคั่นระหว่างรายการ - วิธีแก้ไข

  3. ไม่มีตัวเลือกการซ้อนทับในตัวไม่มีการตอบกลับด้วยภาพเมื่อคุณคลิกที่รายการ - วิธีแก้ปัญหา

  4. ไม่มีaddHeaderViewสำหรับส่วนหัวของรายการ - วิธีแก้ไข

อาจมีปัญหาเพิ่มเติม ...

ดังนั้นเมื่อเราใช้RecyclerViewเพื่อแทนที่เราจะต้องทำมากเป็นพิเศษการเข้ารหัสในการเข้าถึงผลเช่นเดียวกับ ListViewListView

คำถาม:

  • มันคุ้มค่าที่เราจะแทนที่ListViewด้วยRecyclerViewทั้งหมดหรือไม่
  • ถ้าไม่ใช่ในกรณีใดเราควรใช้ดีกว่าRecyclerViewแทนListViewและในทางกลับกัน

9
เธรดของคุณเป็นเพียงปัญหาแรกและไม่ใช่คำถามของฉัน
Xcihnegn

3
เพียงกล่าวถึงว่าคุณต้องใช้ recyclerview หากคุณสนใจที่จะใช้แถบแอ็คชันที่ถูกยุบ medium.com/android-bites/…
francas

คุณควรใช้ recyclerview เพราะให้การควบคุมมากกว่า listview มันซับซ้อนเล็กน้อย แต่คุณไปถึงแล้วชีวิตของคุณจะง่ายมากเมื่อใดก็ตามที่คุณจัดการกับรายการประเภทของสิ่งต่างๆ
Sadashiv

3
ดีกว่าเป็นศัตรูของดี
oldergod

คำตอบ:


118

ถ้า ListView เหมาะกับคุณไม่มีเหตุผลที่จะย้าย หากคุณกำลังเขียน UI ใหม่คุณอาจจะดีกว่าด้วย RecyclerView

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

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


2
ถ้าฉันสามารถให้ 100 upvotes ฉันจะ notifyDataSetChanged()วิธีการที่ก่อให้เกิดของฉันRecyclerViewเพื่อให้ขอใหม่ViewHoldersตลอดเวลาคว้านผลประโยชน์ของViewHolderรูปแบบ กำลังมองหาวิธีการแก้ปัญหาที่ฉันพบความคิดเห็นของคุณซึ่งตอบปัญหาของฉันค่อนข้างผ่าน: D ขอบคุณ!
Dev

ฉันไม่เห็นด้วย "คุณจะได้รับประโยชน์อย่างมากหากมุมมองรายการของคุณมีความซับซ้อน" ฉันมี recyclerView ซึ่งอะแดปเตอร์มี 3 ถ้าอย่างอื่น Recyclerview ทำงานได้ไม่ดีในกรณีของฉัน ฉันต้องปิดการใช้งานการรีไซเคิลisRecyclable(false);และผลลัพธ์สุดท้ายคือความล่าช้าอย่างสูง RecyclerView ฉันไม่สามารถเปลี่ยนแปลงสิ่งนี้ได้มันต้องใช้เวลามากในการกลับไปที่ listview :(
kashyap jimuliya

4
ผู้คนใช้ RV ที่มีประเภทอื่น ๆ อีกมากมายโดยที่ไม่มีปัญหาและประสิทธิภาพที่ดี มีบางอย่างผิดปกติในรหัสของคุณ คุณควรใช้ systrace / traceview และดูว่าเกิดอะไรขึ้น
yigit

1
@kashyapjimuliya ตามที่yigit ได้กล่าวไว้ 3 ถ้าอย่างอื่นไม่ควรทำให้เกิด ประการแรกคุณไม่ได้พูดถึงตำแหน่งที่คุณใส่สิ่งเหล่านี้ถ้า - อื่น; ประการที่สองการปิดใช้งานการรีไซเคิลควรทำให้ช้าลงไม่เร็ว ทำไม? เพราะการทำให้มุมมองและการทำfindViewById()มีราคาแพงกว่าการทำViewHolderแบบนั้น
Sufian

24

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

RecyclerView ให้พลังมหาศาลแก่นักพัฒนาในราคาที่เพิ่มความซับซ้อนให้กับนักพัฒนา มีบางสิ่งที่สามารถทำได้อย่างง่ายดายใน ListView ตอนนี้สามารถใช้ความพยายามที่ไม่จำเป็นมากมาย

แต่ใช่มีหลายสิ่งที่ ListView ไม่สามารถทำได้เช่นคุณสมบัติ LayoutManager ที่น่าทึ่งซึ่งช่วยให้คุณสามารถเปลี่ยนเลย์เอาต์เป็นแนวนอนแนวตั้งกริดหรือกริดที่ซ้อนกันได้อย่างราบรื่น

ผมเขียนคำตอบรายละเอียดเกี่ยวกับหัวข้อนี้ที่นี่


3
แน่นอนว่า RecyclerView เพิ่มความซับซ้อน แต่อย่างน้อยก็ใช้รูปแบบ ViewHolder ที่เหมาะสมสำหรับคุณ
IgorGanapolsky

@IgorGanapolsky +1 สำหรับการใช้รูปแบบ ViewHolder
Sreekanth Karumanaghat

คุณสามารถเขียนรูปแบบตัวยึดมุมมองของคุณเองได้ด้วย ListView
dan

9

1คุณสามารถใช้อินเทอร์เฟซเพื่อให้ผู้ฟังคลิก ฉันใช้เทคนิคนี้กับ ListViews ด้วย
2ไม่มี divider: เพียงแค่เพิ่มในแถวของคุณดูมีความกว้างของmatch_parentและความสูงของ1DPและให้มันเป็นสีพื้นหลัง
3เพียงใช้ตัวเลือก StateList สำหรับพื้นหลังแถว
4 addHeaderView สามารถหลีกเลี่ยงได้ใน ListViews ด้วยเช่นกัน: เพียงใส่ Header ไว้ด้านนอก View

ดังนั้นถ้ามีประสิทธิภาพเป็นกังวลของคุณแล้วใช่มันเป็นความคิดที่ดีที่จะมาแทนที่ ListView กับ RecyclerView


19
นี่ไม่ใช่คำถามของฉันฉันมีลิงก์สำหรับการแก้ไขปัญหาแต่ละข้อ
Xcihnegn

6

ฉันมีจนกระทั่งเมื่อเร็ว ๆ นี้ยังคงใช้ ListView สำหรับรายการที่ง่ายมาก ตัวอย่างเช่นหากฉันต้องการแสดงรายการตัวเลือกข้อความแบบง่าย ...

ฉันใช้การตัดสินใจแบบ 'ปัจจัยมนุษย์' ซึ่งการสร้าง ListView แบบง่ายที่มีรหัสน้อยจะดีกว่าหากประสิทธิภาพนั้นไม่สำคัญ ฉันมักจะนึกถึงอาจารย์ในวิทยาลัยที่ชอบพูดว่า: "อาจารย์ของฉันผู้ยิ่งใหญ่ Niclaus Wirth นักประดิษฐ์แห่งปาสกาลเคยกล่าวไว้ว่าหากโปรแกรมมีรหัสมากกว่า 50 บรรทัดแน่นอนว่าผิด ... "

แต่สิ่งที่ทำให้ฉันหยุดใช้ ListView คือเมื่อเร็ว ๆ นี้มันถูกย้ายไปอยู่ในหมวดหมู่ "Legacy" ในเครื่องมือออกแบบ Android Studio พร้อมกับ RelativeLayout

https://developer.android.com/reference/android/widget/ListView

ฉันคิดว่านี่เป็น 'อ่อน' รูปแบบของ 'คัดค้าน' มันจะยุ่งยากเกินไปหากมันเลิกใช้งานจริงและนักพัฒนาที่ขยันขันแข็งทั้งหมดย้ายรหัสของพวกเขาไปยัง RecyclerView

นอกจากนี้คำนำของ ListView จะเตือนที่ด้านบนสุดว่า RecyclerView เป็นตัวเลือกที่ดีกว่า: "สำหรับวิธีการแสดงรายการที่ทันสมัยยืดหยุ่นและมีประสิทธิภาพยิ่งขึ้นให้ใช้ RecyclerView"
https://developer.android.com/reference/android/widget/ListView

นอกจากนี้คำแนะนำสำหรับ ListView ยังคงพูดถึงเคอร์เซอร์ตัวเลื่อน แต่จากนั้น getSupportCursorLoader () เองเพิ่งเลิกใช้ใน API 28
https://developer.android.com/guide/topics/ui/layout/listview

การปรับปรุงล่าสุดสำหรับ Android Studio:

ไฟล์ -> ใหม่ -> แฟรกเมนต์ -> แฟรกเมนต์ (รายการ)

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

โดยสรุปฉันไม่ต้องการใช้ ListView เลยสำหรับการพัฒนาใหม่เนื่องจากการติดฉลากว่า 'ดั้งเดิม' อยู่ห่างออกไปเพียงขั้นตอนเดียว


3

กรณีเดียวเมื่อยังคงใช้งาน ListView ได้ดีก็คือเมื่อรายการไม่ได้มีการเปลี่ยนแปลงหรือได้รับผลกระทบจากเหตุการณ์เครือข่าย ตัวอย่างเช่น: การนำทาง

สำหรับการใช้งานอื่น ๆ RecyclerView eclipses ListView เนื่องจาก RecyclerView ให้ความสำคัญกับการรีไซเคิลเท่านั้นมันจะง่ายกว่าในการทำสิ่งต่าง ๆ ที่เกี่ยวข้องกับภาพที่ได้รับการผนวกเข้าด้วยกันอย่างแน่นหนาใน ListView เช่นการเปลี่ยนตำแหน่ง / การจัดเรียงใหม่ภาพเคลื่อนไหว (อันที่จริงมาพร้อมกับ รายการเก่าหรือสไตล์กริด แต่ยังมีไลบรารีนี้ซึ่งขยายเพิ่มเติมอีก)

นอกจากนี้หากคุณต้องการใช้ CardView ฉันเชื่อว่ามันเป็นวิธีเดียวที่จะไปได้ (บางการอ่านที่ดีเมื่อใช้การ์ดหรือรายการ)


คุณหมายถึงการคว้ารายการข้อมูลจากเซิร์ฟเวอร์แล้วเก็บไว้ใน sqlite บนโทรศัพท์เพื่อใช้ในการแสดงรายการ (สมมติว่าผู้ติดตามของคุณ) จะดีกว่าการใช้มุมมองรีไซเคิลมากกว่า listview ที่มีมุมมองผู้ถือ ?
Lion789

ใช่. แต่เพื่อความแม่นยำฉันไม่เห็นบทบาทใด ๆ สำหรับ ListView อีกต่อไปยกเว้นการนำทางและนั่นเป็นเพราะฉันคิดว่ามันเกินความจริงที่จะใช้ RecyclerView ที่นั่น
inmyth

2

ทางเลือกที่ยอดเยี่ยมคือการใช้ BaseAdapter รองรับการใช้งานรูปแบบของ Viewholder และเหมืองมี 100+ แถวพร้อมบิตแมปและปุ่มและมันทำงานได้อย่างราบรื่นมาก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.