RecyclerView กับ ListView


295

จากนักพัฒนา android ( การสร้างรายการและการ์ด ):

วิดเจ็ต RecyclerView เป็น ListView เวอร์ชันขั้นสูงและยืดหยุ่นมากขึ้น

โอเคมันฟังดูดี แต่เมื่อฉันเห็นภาพตัวอย่างฉันสับสนจริง ๆ เกี่ยวกับความแตกต่างระหว่างสองสิ่งนี้

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

ภาพด้านบนสามารถสร้างได้ง่าย ๆ โดยListViewใช้ตัวปรับต่อ

ดังนั้นในสถานการณ์ใดบ้างที่ควรใช้RecyclerView?



1
@ Dev786: ฉันขอแนะนำให้คุณเพิ่มความคิดเห็นที่นี่เพื่ออธิบายรายละเอียดสิ่งที่คุณรู้สึกว่าหายไปจากคำตอบที่มีอยู่มากมายในคำถามนี้
CommonsWare

คำตอบ:


374

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

  1. เซลล์ reuses ขณะที่เลื่อนขึ้น / ลง - นี้เป็นไปได้ด้วยการดำเนินการดู Holder ในListViewอะแดปเตอร์ แต่มันก็เป็นสิ่งที่ไม่จำเป็นในขณะที่RecycleViewมันเป็นวิธีการเริ่มต้นของการเขียนอะแดปเตอร์

  2. decouples รายการจากภาชนะที่ใช้บรรจุ - เพื่อให้คุณสามารถใส่รายการได้อย่างง่ายดายในเวลาทำงานในภาชนะบรรจุที่แตกต่างกัน (LinearLayout, gridLayout) LayoutManagerด้วยการตั้งค่า

ตัวอย่าง:

mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
//or
mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2));
  1. เคลื่อนไหวการดำเนินรายการร่วมกัน - ItemAnimatorภาพเคลื่อนไหวจะหลุดพ้นและมอบหมายให้

มีอะไรเพิ่มเติมเกี่ยวกับRecyclerViewแต่ฉันคิดว่าประเด็นเหล่านี้เป็นประเด็นหลัก

ดังนั้นเพื่อสรุปRecyclerViewก็คือการควบคุมที่ยืดหยุ่นมากขึ้นสำหรับการจัดการ "รายการข้อมูล" ที่เป็นไปตามรูปแบบของการมอบหมายความกังวลและปล่อยให้ตัวเองมีงานเดียวเท่านั้น - รายการรีไซเคิล


16
ความรับผิดชอบหลักของมุมมองรายการคือ 1. ) จัดเรียงรายการทางสายตาภายในพื้นที่ที่กำหนดและเด่นกว่า 2. ) นำรายการมาใช้ซ้ำ ด้วย RecylerView สิ่งนี้จะแบ่งออกเป็นความรับผิดชอบเดียว - รีไซเคิลมุมมองการรีไซเคิลและได้รับ LayoutManager จัดเรียงรายการบนหน้าจอ กล่าวอีกนัยหนึ่งคือมุมมองรีไซเคิลไม่ทราบว่าจะต้องวางรายการไว้ที่ใดบนหน้าจอ จาก android doc: "โดยการเปลี่ยน LayoutManager RecyclerView สามารถใช้ในการใช้รายการเลื่อนแนวตั้งแบบมาตรฐาน, กริดสม่ำเสมอ, กริดเซ, คอลเลคชั่นเลื่อนแนวนอนและอื่น ๆ "
daneejela

32
"นำเซลล์กลับมาใช้ใหม่ขณะเลื่อนขึ้น / ลง": เท่าที่ฉันรู้ว่านี่เป็นสิ่งที่ผิดอย่างสมบูรณ์เพราะสิ่งนี้เกิดขึ้นแม้ในมุมมองรายการโดยไม่มีผู้ดู
Ruban

16
การใช้ตัวยึดมุมมองหลักใน listview คือรหัสของคุณอาจเรียกใช้ findViewById () บ่อยครั้งในระหว่างการเลื่อนดูของ ListView ซึ่งอาจทำให้ประสิทธิภาพการทำงานช้าลง แม้ว่าอะแดปเตอร์จะคืนค่ามุมมองที่สูงเกินจริงเพื่อการรีไซเคิลคุณยังคงต้องค้นหาองค์ประกอบและอัปเดตองค์ประกอบเหล่านั้น วิธีการใช้ findViewById () ซ้ำ ๆ กันคือการใช้รูปแบบการออกแบบ วัตถุ ViewHolder เก็บมุมมองคอมโพเนนต์แต่ละรายการภายในฟิลด์แท็กของเค้าโครงเพื่อให้คุณสามารถเข้าถึงได้ทันทีโดยไม่จำเป็นต้องค้นหาซ้ำ ๆ
Ruban

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

พวกเขาไม่ได้ทำอะไรพิเศษคุณสมบัติเหล่านี้สามารถเพิ่มได้โดยทุกคน คุณสามารถขยาย ListView และ baseAdapter และเพิ่มคุณสมบัติใด ๆ ได้ถ้าคุณต้องการ จริงๆแล้วไม่มีความแตกต่างระหว่างสองสิ่งนี้
MDP

39

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

RecyclerView ทำให้รูปแบบนี้ทำให้ยากต่อการเลอะ นอกจากนี้ยังมีความยืดหยุ่นมากขึ้นทำให้จัดการรูปแบบที่แตกต่างกันได้ง่ายขึ้นซึ่งไม่ได้เป็นเส้นตรงเหมือนกริด


6
ใช่! ควรมีการอภิปรายเพิ่มเติมเมื่อไม่ควรใช้ recyclerview ด้วย หากแถวของคุณมีการเพิ่มเนื้อหาแบบไดนามิกตามข้อมูลของโมเดลและคุณใช้มุมมอง Recycler, BOOM
Rana Deep

1
คุณควรจะสามารถเพิ่มเนื้อหาแบบไดนามิกตามข้อมูลรูปแบบ คุณเพียงแค่ต้องตั้งค่ามุมมองต่าง ๆ สำหรับเนื้อหาประเภทใด ๆ ที่คุณต้องการให้การสนับสนุน
CaptRespect

36

ListViewRecyclerViewเป็นบรรพบุรุษ มีหลายสิ่งที่ListViewทั้งทำไม่ได้หรือทำไม่ดี หากคุณต้องรวบรวมข้อบกพร่องของListViewและแก้ไขปัญหาโดยสรุปปัญหาไปยังโดเมนต่าง ๆ คุณจะต้องจบลงด้วยมุมมองของนักรีไซเคิล นี่คือปัญหาหลักที่มี ListViews:

  • ไม่บังคับใช้Viewซ้ำสำหรับประเภทรายการเดียวกัน (ดูที่หนึ่งในอะแดปเตอร์ที่ใช้ใน a ListViewหากคุณศึกษาวิธี getView คุณจะเห็นว่าไม่มีอะไรที่จะป้องกันไม่ให้โปรแกรมเมอร์สร้างมุมมองใหม่สำหรับทุกแถวแม้ว่าจะผ่านไปแล้วก็ตาม ผ่านconvertViewตัวแปร)

  • ไม่ได้ป้องกันการใช้findViewByIdงานที่มีราคาแพง(แม้ว่าคุณจะรีไซเคิลมุมมองตามที่ระบุไว้ข้างต้นมันเป็นไปได้ที่ devs จะเรียกfindViewByIdเพื่ออัปเดตเนื้อหาที่แสดงของมุมมองลูกวัตถุประสงค์หลักของViewHolderรูปแบบในListViewsคือการแคชการfindViewByIdโทร ใช้ได้ถ้าคุณรู้เกี่ยวกับมันเพราะมันไม่ได้เป็นส่วนหนึ่งของแพลตฟอร์มเลย)

  • เพียง แต่ได้รับการสนับสนุนเลื่อนแนวตั้งแถวแสดงเข้าชม (Recycler มุมมองที่ไม่ได้ดูแลเกี่ยวกับการที่มองเห็นวิวจะถูกวางไว้และวิธีการที่พวกเขาจะถูกย้ายก็ใจลอยเป็นLayoutManager. รีไซเคิลจึงสามารถรองรับการแบบดั้งเดิมListViewที่แสดงข้างต้นเช่นเดียวกับสิ่งที่ต้องการGridViewแต่ มันไม่ได้ จำกัด อยู่แค่นั้นมันสามารถทำอะไรได้มากกว่า แต่คุณต้องทำงานเขียนโปรแกรมเพื่อให้มันเกิดขึ้น)

  • ภาพเคลื่อนไหวเพื่อเพิ่ม / ลบไม่ใช่กรณีการใช้งานที่ถูกพิจารณา มันขึ้นอยู่กับคุณแล้วว่าจะคิดอย่างไรเกี่ยวกับเรื่องนี้ (เปรียบเทียบ RecyclerView คลาสของอะแดปเตอร์แจ้งให้ทราบถึงวิธีการเสนอ v. ListViews เพื่อรับแนวคิด)

ในระยะสั้นRecyclerViewจะมีความยืดหยุ่นมากขึ้นถึงListViewแม้ว่าการเข้ารหัสเพิ่มเติมอาจต้องทำในส่วนของคุณ


20

RecyclerViewเป็น ViewGroup ใหม่ที่เตรียมที่จะทำให้มุมมองของอะแดปเตอร์ที่ใช้ใด ๆ ในลักษณะที่คล้ายกัน มันเป็น supossed จะเป็นตัวตายตัวแทนของและมันสามารถพบได้ในListView and GridView ได้รับการพัฒนาด้วยการขยายในใจเพื่อให้มันเป็นไปได้ที่จะสร้างชนิดของรูปแบบใด ๆ ที่คุณสามารถคิด แต่ไม่ได้โดยไม่มีอาการปวดยา-in-the-ass เล็ก ๆ น้อย ๆlatest support-v7 versionRecyclerView

คำตอบที่นำมาจากAntonio leiva

 compile 'com.android.support:recyclerview-v7:27.0.0'

RecyclerViewแน่นอนกว่าpowerful view ListViewสำหรับรายละเอียดเพิ่มเติมคุณสามารถเยี่ยมชมหน้านี้


5
ฉันชอบประโยคนี้จากคำตอบของคุณ: นี่คือ Android ดังนั้นสิ่งต่าง ๆ ไม่เคยง่ายสิ่งนี้เป็นจริงสำหรับสิ่งที่การพัฒนาแอป Android กำลังทำอยู่ แต่ฉันคิดว่ามันเป็นสิ่งผิดปกติในวิธีที่พวกเขาออกแบบ API รวมถึงรูปแบบการสร้าง แอพ Android ในทางทฤษฎีการออกแบบที่ดีควรซ่อนความซับซ้อนที่เป็นไปได้ทั้งหมดจากโปรแกรมเมอร์ (แต่ยังสามารถเข้าถึงได้สำหรับคนขั้นสูง) สิ่งที่พวกเขาสนใจคือตรรกะทางธุรกิจข้อมูลและอัลกอริธึมอื่น ๆ นอกเหนือจากการจัดการกับปัญหา ในการพัฒนา Android)
สิ้นหวัง

18

ต่อไปนี้เป็นประเด็นสำคัญ / ความแตกต่างระหว่าง RecyclerView และ ListView ใช้สายของคุณอย่างชาญฉลาด

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

RecylerView มี inHilt ViewHolder ไม่จำเป็นต้องใช้ตัวเราเองเหมือนใน listView รองรับการแจ้งเตือนที่ดัชนีโดยเฉพาะเช่นกัน

สิ่งต่าง ๆ เช่นการเคลื่อนไหวการเพิ่มหรือการลบรายการนั้นมีการนำมาใช้ใน RecyclerView แล้วโดยที่คุณไม่ต้องทำอะไรเลย

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

i) LinearLayoutManager - ซึ่งรองรับรายการทั้งแนวตั้งและแนวนอน ii) StaggeredLayoutManager - ซึ่งรองรับ Pinterest เช่นรายการที่เซ, iii) GridLayoutManager - ซึ่งรองรับการแสดงกริดที่เห็นในแอพแกลเลอรี่

และสิ่งที่ดีที่สุดคือเราสามารถทำสิ่งเหล่านี้แบบไดนามิกตามที่เราต้องการ


14

ข้อได้เปรียบที่สำคัญ:

ViewHolderListViewไม่สามารถใช้ได้โดยเริ่มต้นใน getView()เราจะสร้างอย่างชัดเจนภายใน RecyclerViewมี Viewholderinbuilt


4

นอกเหนือจากความแตกต่างข้างต้นดังต่อไปนี้มีอีกไม่กี่:

  1. RV แยกการสร้างมุมมองและการเชื่อมโยงข้อมูลเพื่อดู ใน LV คุณต้องตรวจสอบว่า convertView เป็นค่าว่างหรือไม่สำหรับการสร้างมุมมองก่อนผูกข้อมูลเข้ากับมัน ดังนั้นในกรณีของ RV มุมมองจะถูกสร้างขึ้นเฉพาะเมื่อจำเป็น แต่ในกรณีของ LV ผู้ใช้สามารถพลาดการตรวจสอบ convertview และจะสร้างมุมมองทุกครั้ง

  2. การสลับไปมาระหว่าง Grid และ List นั้นทำได้ง่ายขึ้นด้วย LayoutManager

  3. ไม่จำเป็นต้องแจ้งเตือนและอัปเดตทุกรายการแม้ว่าจะมีการเปลี่ยนแปลงรายการเดียวเท่านั้น

  4. หนึ่งต้องใช้การดูแคชในกรณีที่ LV มันมีให้ใน RV โดยค่าเริ่มต้น (มีความแตกต่างระหว่างการดูแคชและการรีไซเคิล)

  5. แอนิเมชันไอเท็มง่ายมากในกรณีของ RV


4

ข้อดีของ RecyclerView ผ่าน listview:

  1. มี ViewHolder ตามค่าเริ่มต้น

  2. ภาพเคลื่อนไหวง่าย

  3. รองรับเลย์เอาต์แนวนอนกริดและเลย์เอาต์

ข้อดีของ listView ผ่าน recyclerView:

  1. เพิ่มตัวแบ่งได้ง่าย

  2. สามารถใช้ arrayAdapter inbuilt สำหรับรายการธรรมดาที่เรียบง่าย

  3. รองรับส่วนหัวและส่วนท้าย

  4. รองรับ OnItemClickListner


4
เท่าที่ฉันเข้าใจคุณสามารถเพิ่มตัวแบ่งลงใน recyclerView โดยใช้recyclerView.addItemDecoration(new DividerItemDecoration(getContext(), LinearLayoutManager.VERTICAL));หลังจากทำสิ่งที่ต้องการrecyclerView = view.findViewById(R.id.feed);
nviens

1
@nviens สำหรับมุมมองรายการคุณสามารถเพิ่มตัวแบ่งปรับความสูงและเปลี่ยนสีได้ด้วยตัวเอง นอกจากนี้ยัง implemention ปัจจุบันแบ่งเป็นเพียงตกลงมันเป็นฝันร้ายที่จะเพิ่ม divider สำหรับ recyclerview ก่อนหน้านี้เป็นเพียงการตรวจสอบคำตอบนี้เพื่อดูวิธีการดำเนินการก่อนหน้านี้สำหรับแบ่งเป็นstackoverflow.com/a/27037230/6478047
มาโนฮาร์เรดดี้

4

8 ความแตกต่างระหว่าง RecyclerView และ ListView

Recyclerview เทียบกับ ListView

1. รูปแบบ ViewHolder

รูปแบบที่ใช้ในการลดการโทรไปยังfindViewById ()วิธีการ

ใน ListView คุณสามารถสร้างรายการได้อย่างง่ายดายโดยไม่ต้องใช้ ViewHolder แต่ไม่ใช่ในกรณีของ RecyclerView

2. อะแดปเตอร์

ทั้งคู่เป็น AdapterViews ใช่ มันทำงานบนพื้นฐานของคลาสอะแดปเตอร์

มันง่ายต่อการสร้าง ListView โดยใช้อะแดปเตอร์เริ่มต้นเช่น ArrayAdapter, CursorAdapter แต่ RecyclerView ให้คลาส RecyclerView.Adapter เพื่อสร้างคลาสอะแดปเตอร์ใหม่เอง

คุณไม่สามารถใช้ ArrayAdapter หรืออะแดปเตอร์ในตัวอื่นกับ RecyclerView

3. การจัดรายการ

ฉันได้สร้าง ListView แนวตั้งในรหัสที่ง่ายและน้อยกว่า แต่ถ้าเราต้องการสร้าง GridView

RecyclerView ใช้ LayoutManager เพื่อจัดเรียงรายการ มีคลาส LayoutManager 3 คลาส

  • LinearLayoutManager - ช่วยในการสร้างรายการประเภทเชิงเส้น
  • GridLayoutManager - ใช้เพื่อสร้างกริด
  • StaggeredGridLayoutManager - ใช้เพื่อสร้าง staggeredgrid

ภาพเคลื่อนไหว

ListView ไม่มีภาพเคลื่อนไหวพื้นฐาน แต่ RecyclerView มาพร้อมกับภาพเคลื่อนไหวที่เรียบง่าย

divider

แอนดรอยด์: ตัวแบ่งและแอนดรอยด์:คุณสมบัติตัวคั่นหรือ setDivider (), setDividerHeight () ช่วยให้คุณสร้างตัวแบ่งที่กำหนดเองใน ListView

ตั้งแต่ 25.1.0 คุณสามารถใช้คลาสDividerItemDecorationเพื่อสร้างตัวแบ่งอย่างง่าย

คลิกกิจกรรม

RecyclerView ไม่มีOnItemClickListenerใช่ว่ามันน่าเศร้ามาก แต่พวกเขาให้การควบคุมเพิ่มเติมแก่นักพัฒนาโดยการให้RecyclerViewOnItemTouchListener

แจ้งวิธีการ

คุณต้องโทรวิธีการแจ้งเตือน * ที่เหมาะสมเพื่อดำเนินการเคลื่อนไหวที่ถูกต้อง RecylcerView มีวิธีแจ้งเตือนมากมายเมื่อเปรียบเทียบกับ ListView


3

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


2

ในความคิดของฉันRecyclerViewถูกสร้างขึ้นมาเพื่อแก้ไขปัญหาเกี่ยวกับรูปแบบการรีไซเคิลที่ใช้ในการดูรายการเพราะมันทำให้ชีวิตของนักพัฒนายากขึ้น ส่วนอื่น ๆ ที่คุณสามารถจัดการได้ไม่มากก็น้อย ยกตัวอย่างเช่นผมใช้อะแดปเตอร์เดียวกันสำหรับListViewและGridViewมันไม่สำคัญว่าในมุมมองทั้งgetView, getItemCount, getTypeCountถูกนำมาใช้ดังนั้นจึงเป็นเรื่องเดียวกัน RecyclerViewไม่จำเป็นถ้าListViewมีListAdapterหรือGridViewกับตัวแปลงกริดที่ทำงานให้คุณแล้ว หากคุณมีการดำเนินการอย่างถูกต้องViewHolderในรูปแบบ listviews RecycleViewของคุณแล้วคุณจะไม่เห็นการปรับปรุงใหญ่ใด


2

ผมทำงานเล็ก ๆ น้อย ๆ ด้วยและยังคงต้องการRecyclerViewListView

  1. แน่นอนว่าพวกเขาทั้งคู่ใช้ViewHoldersดังนั้นนี่จึงไม่ใช่ข้อได้เปรียบ

  2. การRecyclerViewเข้ารหัสยากกว่า

  3. A RecyclerViewไม่มีส่วนหัวและส่วนท้ายดังนั้นมันจึงเป็นลบ

  4. ListViewไม่จำเป็นต้องที่จะทำให้ ViewHolder ในกรณีที่คุณต้องการมีรายการที่มีส่วนหรือส่วนหัวย่อยเป็นความคิดที่ดีที่จะสร้างรายการอิสระ (โดยไม่มี ViewHolder) มันง่ายกว่าและไม่ต้องแยกชั้นเรียน


1
คุณสามารถสร้างส่วนหัวและเนื้อหาในอะแดปเตอร์ recyclerview และมันจะมีความยืดหยุ่นมากกว่า listview แค่เปลี่ยนมุมมองลิสต์ของคุณเป็น recyclerview แต่ถ้าคุณทำได้คุณจะเข้าใจในสิ่งที่ฉันหมายถึงลิสต์ที่เลิกใช้เพียงลองไปเรียนรู้ recyclerview goodluck
erginduran

2
@erginduran ฉันใช้ทั้งคู่ ListView ยังคงใช้กันอย่างแพร่หลายและไม่ได้คัดค้าน นอกจากนี้ยังใช้หน่วยความจำน้อยกว่า RecyclerView หากคุณต้องการแทนที่ ListView ด้วย RecyclerView เพียงอย่างเดียวนั่นไม่ใช่ความคิดที่ดี
CoolMind

ตรวจสอบว่าทำไมคนพวกนี้ถึงพัฒนา recyclerview เพื่อ? การปรับปรุง listview มันใช่ไหม? มี libs และแอปเก่า ๆ มากมายใน Google Play คุณจึงเป็นคนฟังรายการที่ถูกต้องและยังคงใช้กันอย่างแพร่หลายเพียงแค่ทิ้งของเก่าไว้ในอดีต ตรวจสอบการเปรียบเทียบ -> ลิงก์
erginduran

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

ฉันเพิ่มแง่มุมบางอย่างในหัวข้อที่ดูstackoverflow.com/a/39721769/2914140
CoolMind

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

ดังนั้นหากความกังวลของคุณเป็นเรื่องที่มีประสิทธิภาพคุณควรเปลี่ยน ListView ด้วย RecyclerView


0

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

คุณพบว่ามันยากขึ้นเพราะคุณกำลังคิดอยู่ในใจห้องสมุด Android เท่านั้น

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

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

ฉันขอแนะนำให้คุณตรวจสอบสองไลบรารีนี้เพื่อสร้างอะแดปเตอร์ที่ง่าย:

FastAdapter โดย mikepenz

FlexibleAdapter โดย davideas


1
ฉันคิดว่าข้อความของคุณเกี่ยวกับความแตกต่างของประสิทธิภาพระหว่างทั้งสองนั้นเกินจริง ฉันใช้ ListView ในแอพโปรดักชั่นมาตั้งแต่ปี 2555 แสดงรายการได้ถึง 3000 รายการด้วยจำนวนการดูแตกต่างกัน ~ 10 ครั้งในแต่ละแถวไม่มีปัญหาเรื่องประสิทธิภาพแม้ในอุปกรณ์ Android 2.3 รุ่นเก่า
แมกนัส W

0

ข้อมูล RecyclerView

ถูกนำมาใช้กับRecyclerView Android 5.0 (Lollipop)มันจะรวมอยู่ในห้องสมุดสนับสนุน ดังนั้นจึงเข้ากันได้กับ Android API ระดับ 7

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

ข้อดีข้อเสียของ RecyclerView

ข้อดี:

  • ภาพเคลื่อนไหวรวมสำหรับการเพิ่มอัปเดตและลบรายการ
  • บังคับใช้การรีไซเคิลมุมมองโดยใช้รูปแบบ ViewHolder
  • รองรับทั้งกริดและรายการ
  • รองรับการเลื่อนแนวตั้งและแนวนอน
  • สามารถใช้ร่วมกับ DiffUtil

จุดด้อย:

  • เพิ่มความซับซ้อน
  • ไม่มี OnItemClickListener

ข้อมูล ListView

สิ่งที่ListViewได้รับรอบตั้งแต่จุดเริ่มต้นของ Android มันก็สามารถใช้ได้แม้ในและมีวัตถุประสงค์เช่นเดียวกับAPI Level 1RecyclerView

การใช้งาน ListView นั้นง่ายมากจริงๆ ในแง่นี้มันไม่เหมือนผู้สืบทอด เส้นโค้งการเรียนรู้นั้นราบรื่นกว่า RecyclerView ดังนั้นจึงง่ายต่อการเข้าใจ เราไม่ต้องจัดการกับสิ่งต่าง ๆ เช่น LayoutManager, ItemAnimator หรือ DiffUtil

ข้อดีและข้อเสียของ ListView

ข้อดี:

  • การใช้งานง่าย
  • อะแดปเตอร์เริ่มต้น
  • พร้อมใช้งาน OnItemClickListener
  • มันเป็นรากฐานของ ExpandableListView

จุดด้อย:

  • ไม่ยอมรับการใช้งานรูปแบบ ViewHolder

0

มีความแตกต่างมากมายระหว่าง ListView และ RecyclerView แต่คุณควรระวังสิ่งต่อไปนี้โดยเฉพาะ:

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