Codelab นี้เป็นส่วนหนึ่งของหลักสูตรหลักพื้นฐานของ Android Kotlin คุณจะได้รับประโยชน์สูงสุดจากหลักสูตรนี้หากทำตาม Codelab ตามลำดับ Codelab ของหลักสูตรทั้งหมดแสดงอยู่ในหน้า Landing Page ของ Codelab หลักพื้นฐานของ Android Kotlin
บทนำ
ข้อดีหลักอย่างหนึ่งของ RecyclerView
คือการอนุญาตให้คุณใช้เครื่องมือจัดการเลย์เอาต์เพื่อควบคุมและแก้ไขกลยุทธ์เลย์เอาต์ LayoutManager
จะจัดการวิธีจัดเรียงรายการใน RecyclerView
RecyclerView
มาพร้อมกับตัวจัดการเลย์เอาต์สำเร็จรูปสำหรับ Use Case ทั่วไป เช่น คุณใช้ LinearLayout
สำหรับรายการแนวนอนและแนวตั้ง หรือ GridLayout
สำหรับตารางกริดได้ สําหรับ Use Case ที่ซับซ้อนมากขึ้น คุณต้องใช้ LayoutManager
ที่กําหนดเอง
ใน Codelab นี้ คุณจะได้เรียนรู้วิธีแสดงข้อมูลโดยใช้เลย์เอาต์ตารางกริดแทนรายการ ซึ่งต่อยอดจากแอปติดตามการนอนหลับจาก Codelab ก่อนหน้า (หากไม่มีแอปจากโค้ดแล็บก่อนหน้า คุณสามารถดาวน์โหลดโค้ดเริ่มต้นสำหรับโค้ดแล็บนี้ได้)
สิ่งที่คุณควรทราบอยู่แล้ว
คุณควรคุ้นเคยกับสิ่งต่อไปนี้
- การสร้างอินเทอร์เฟซผู้ใช้พื้นฐานโดยใช้
Activity
,Fragments
และViews
- การไปยังมาระหว่าง Fragment และการใช้
safeArgs
เพื่อส่งข้อมูลระหว่าง Fragment - ดูโมเดล ดูโรงงานโมเดล และการเปลี่ยนรูปแบบ
LiveData
และผู้สังเกตการณ์- วิธีสร้าง
Room
ฐานข้อมูล สร้าง DAO และกำหนดเอนทิตี - วิธีใช้โครูทีนสำหรับงานฐานข้อมูลและงานอื่นๆ ที่ใช้เวลานาน
- วิธีใช้
RecyclerView
พื้นฐานกับAdapter
,ViewHolder
และเลย์เอาต์ของสินค้า - วิธีใช้การเชื่อมโยงข้อมูลสำหรับ
RecyclerView
- วิธีสร้างและใช้อะแดปเตอร์การเชื่อมโยงเพื่อเปลี่ยนรูปแบบข้อมูล
สิ่งที่คุณจะได้เรียนรู้
- วิธีใช้
LayoutManager
อื่นเพื่อเปลี่ยนวิธีแสดงข้อมูลในRecyclerView
- วิธีสร้างเลย์เอาต์ตารางกริดสำหรับข้อมูลการนอนหลับ
สิ่งที่คุณต้องดำเนินการ
- สร้างต่อจากแอปติดตามการนอนหลับจาก Codelab ก่อนหน้าในชุดนี้
- แทนที่รายการข้อมูลการนอนหลับที่แสดงโดย
RecyclerView
ในแอปด้วยตารางข้อมูลการนอนหลับ
แอปติดตามการนอนหลับมี 2 หน้าจอซึ่งแสดงด้วย Fragment ดังที่แสดงในรูปภาพด้านล่าง
หน้าจอแรกที่แสดงทางด้านซ้ายมีปุ่มสำหรับเริ่มและหยุดการติดตาม หน้าจอจะแสดงข้อมูลการนอนหลับบางส่วนของผู้ใช้ ปุ่มล้างจะลบข้อมูลทั้งหมดที่แอปเก็บรวบรวมไว้สำหรับผู้ใช้ออกอย่างถาวร หน้าจอที่ 2 ซึ่งแสดงทางด้านขวาใช้สำหรับเลือกคะแนนคุณภาพการนอนหลับ
แอปนี้ใช้สถาปัตยกรรมที่เรียบง่ายพร้อมตัวควบคุม UI, ViewModel และ LiveData
รวมถึงฐานข้อมูล Room
เพื่อจัดเก็บข้อมูลการนอนหลับ
ข้อมูลการนอนหลับจะแสดงในRecyclerView
ในโค้ดแล็บนี้ คุณจะเปลี่ยนแอปให้ใช้ GridLayout
หน้าจอสุดท้ายจะมีลักษณะเหมือนภาพหน้าจอด้านล่าง
ในโค้ดแล็บก่อนหน้านี้ เมื่อคุณเพิ่ม RecyclerView
ลงใน fragment_sleep_tracker.xml
คุณได้เพิ่ม LinearLayoutManager
โดยไม่มีการปรับแต่งใดๆ โค้ดนี้จะแสดงข้อมูลเป็นรายการแนวตั้ง
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
LinearLayoutManager
เป็นเครื่องมือจัดการเลย์เอาต์ที่พบบ่อยและตรงไปตรงมาที่สุดสำหรับ RecyclerView
และรองรับการวางมุมมองย่อยทั้งในแนวนอนและแนวตั้ง เช่น คุณสามารถใช้ LinearLayoutManager
เพื่อสร้างภาพสไลด์ที่ผู้ใช้เลื่อนในแนวนอนได้
GridLayout
อีกกรณีการใช้งานที่พบบ่อยคือการต้องแสดงข้อมูลจำนวนมากต่อผู้ใช้ ซึ่งคุณทำได้โดยใช้ GridLayout
GridLayoutManager
สำหรับ RecyclerView
จะจัดวางข้อมูลเป็นตารางกริดที่เลื่อนได้ ดังที่แสดงด้านล่าง
ในมุมมองด้านการออกแบบ GridLayout
เหมาะที่สุดสำหรับรายการที่แสดงเป็นไอคอนหรือรูปภาพได้ เช่น รายการภายในแอปเรียกดูรูปภาพ ในแอปติดตามการนอนหลับ คุณอาจแสดงการนอนหลับในแต่ละคืนเป็นตารางไอคอนขนาดใหญ่ การออกแบบนี้จะช่วยให้ผู้ใช้เห็นภาพรวมของคุณภาพการนอนหลับได้อย่างรวดเร็ว
วิธีที่ GridLayout จัดวางรายการ
GridLayout
จัดเรียงรายการในตารางกริดของแถวและคอลัมน์ โดยค่าเริ่มต้น เมื่อเลื่อนแนวตั้ง รายการแต่ละรายการในแถวจะใช้ "ช่วง" 1 ช่วง (ในกรณีนี้ ช่วง 1 ช่วงจะเท่ากับความกว้างของ 1 คอลัมน์)
ใน 2 ตัวอย่างแรกที่แสดงด้านล่าง แต่ละแถวประกอบด้วยช่วง 3 ช่วง โดยค่าเริ่มต้น GridLayoutManager
จะจัดวางแต่ละรายการในระยะเวลา 1 ช่วงจนกว่าจะถึงจำนวนช่วงที่คุณระบุ เมื่อถึงจำนวนช่วง ระบบจะขึ้นบรรทัดใหม่
โดยค่าเริ่มต้น แต่ละรายการจะใช้ 1 ช่วง แต่คุณสามารถทำให้รายการกว้างขึ้นได้โดยการระบุจำนวนช่วงที่จะใช้ เช่น รายการบนสุดในหน้าจอขวาสุด (แสดงด้านล่าง) จะใช้ 3 ช่วง
ในงานนี้ คุณจะใช้ RecyclerView
ที่ทำเสร็จแล้วในแบบฝึกหัดที่ผ่านมาและอัปเดตให้แสดงข้อมูลโดยใช้ GridLayoutManager
คุณจะใช้แอปติดตามการนอนหลับจากโค้ดแล็บก่อนหน้าต่อไป หรือจะดาวน์โหลดแอป RecyclerViewGridLayout-Starter จาก GitHub ก็ได้
ขั้นตอนที่ 1: เปลี่ยน LayoutManager
- หากจำเป็น ให้ดาวน์โหลดแอป RecyclerViewGridLayout-Starter สำหรับโค้ดแล็บนี้จาก GitHub แล้วเปิดโปรเจ็กต์ใน Android Studio
- เปิดไฟล์เลย์เอาต์
fragment_sleep_tracker.xml
- นำ Layout Manager ออกจากคำจำกัดความของ
sleep_list
RecyclerView
โค้ดที่จะลบ
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager
- เปิด
SleepTrackerFragment.kt
- ใน
OnCreateView()
ให้สร้างGridLayoutManager
ใหม่ในแนวตั้งจากบนลงล่างโดยมี 3 ช่วง
ก่อนคำสั่งreturn
เพียงเล็กน้อย ตัวสร้างGridLayoutManager
รับอาร์กิวเมนต์ได้สูงสุด 4 รายการ ได้แก่ บริบท ซึ่งก็คือactivity
จำนวนช่วง (คอลัมน์ในเลย์เอาต์แนวตั้งเริ่มต้น) การวางแนว (ค่าเริ่มต้นคือแนวตั้ง) และเลย์เอาต์ย้อนกลับ (ค่าเริ่มต้นคือfalse
)
val manager = GridLayoutManager(activity, 3)
- ใต้บรรทัดนั้น ให้บอก
RecyclerView
ว่าให้ใช้GridLayoutManager
นี้RecyclerView
อยู่ในออบเจ็กต์การเชื่อมโยงและเรียกว่าsleepList
(ดูfragment_sleep_tracker.xml
)
binding.sleepList.layoutManager = manager
ขั้นตอนที่ 2: เปลี่ยนเลย์เอาต์
เลย์เอาต์ปัจจุบันใน list_item_sleep_night.xml
จะแสดงข้อมูลโดยใช้ทั้งแถวต่อคืน ในขั้นตอนนี้ คุณจะกำหนดเลย์เอาต์ของสินค้าสี่เหลี่ยมจัตุรัสที่กะทัดรัดยิ่งขึ้นสำหรับตารางกริด
- เปิด
list_item_sleep_night.xml
- ลบ
sleep_length
TextView
เนื่องจากดีไซน์ใหม่ไม่จำเป็นต้องใช้ - ย้าย
quality_string
TextView
เพื่อให้แสดงใต้ImageView
คุณต้องอัปเดตหลายอย่างเพื่อทำเช่นนั้น นี่คือเลย์เอาต์สุดท้ายสำหรับquality_string
TextView
<TextView
android:id="@+id/quality_string"
android:layout_width="0dp"
android:layout_height="20dp"
android:textAlignment="center"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@+id/quality_image"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="@+id/quality_image"
app:layout_constraintTop_toBottomOf="@+id/quality_image"
tools:text="Excellent!!!"
app:sleepQualityString="@{sleep}" />
- ตรวจสอบในมุมมองการออกแบบว่า
quality_string
TextView
อยู่ใต้ImageView
เนื่องจากคุณใช้การเชื่อมโยงข้อมูล จึงไม่จำเป็นต้องเปลี่ยนแปลงสิ่งใดใน Adapter
โค้ดควรทำงานได้ และรายการควรแสดงเป็นตารางกริด
- เรียกใช้แอปและสังเกตวิธีแสดงข้อมูลการนอนหลับในตารางกริด
โปรดทราบว่าConstraintLayout
ยังคงใช้ความกว้างทั้งหมดGridLayoutManager
จะกำหนดความกว้างคงที่ให้กับมุมมองตามช่วงของมุมมองGridLayoutManager
พยายามอย่างเต็มที่เพื่อให้เป็นไปตามข้อจำกัดทั้งหมดเมื่อจัดวางตารางกริด เพิ่มพื้นที่ว่าง หรือครอบตัดรายการ
- ใน
SleepTrackerFragment
ในโค้ดที่สร้างGridLayoutManager
ให้เปลี่ยนจำนวนช่วงสำหรับGridLayoutManger
เป็น 1 เรียกใช้แอป แล้วคุณจะเห็นรายการ
val manager = GridLayoutManager(activity, 1)
- เปลี่ยนจำนวนช่วงสำหรับ
GridLayoutManager
เป็น 10 แล้วเรียกใช้แอป สังเกตว่าGridLayoutManager
จะพอดีกับ 10 รายการในแถว แต่ตอนนี้รายการต่างๆ ถูกตัดออก - เปลี่ยนจำนวนช่วงเป็น 5 และทิศทางเป็น
GridLayoutManager.VERTICAL
เรียกใช้แอปและสังเกตว่าคุณเลื่อนในแนวนอนได้อย่างไร คุณจะต้องใช้เลย์เอาต์อื่นเพื่อให้ดูดี
val manager = GridLayoutManager(activity, 5, GridLayoutManager.HORIZONTAL, false)
- อย่าลืมตั้งค่าจำนวนช่วงกลับเป็น 3 และการวางแนวเป็นแนวตั้ง
โปรเจ็กต์ Android Studio: RecyclerViewGridLayout
- ตัวจัดการเลย์เอาต์จะจัดการวิธีจัดเรียงรายการใน
RecyclerView
RecyclerView
มาพร้อมกับเครื่องมือจัดการเลย์เอาต์สำเร็จรูปสำหรับ Use Case ทั่วไป เช่นLinearLayout
สำหรับรายการแนวนอนและแนวตั้ง และGridLayout
สำหรับตารางกริด- สำหรับ Use Case ที่ซับซ้อนมากขึ้น ให้ใช้
LayoutManager
ที่กำหนดเอง - ในมุมมองการออกแบบ
GridLayout
เหมาะที่สุดสำหรับรายการที่แสดงเป็นไอคอนหรือรูปภาพได้ GridLayout
จัดเรียงรายการในตารางกริดของแถวและคอลัมน์ เมื่อเลื่อนในแนวตั้ง แต่ละรายการในแถวจะใช้สิ่งที่เรียกว่า "ช่วง"- คุณปรับแต่งจำนวนช่องที่รายการใช้ได้เพื่อสร้างตารางกริดที่น่าสนใจยิ่งขึ้นโดยไม่ต้องใช้เครื่องมือจัดการเลย์เอาต์ที่กำหนดเอง
- สร้างเลย์เอาต์ของรายการสำหรับ 1 รายการในตารางกริด แล้วตัวจัดการเลย์เอาต์จะดูแลการจัดเรียงรายการ
- คุณตั้งค่า
LayoutManager
สำหรับRecyclerView
ได้ทั้งในไฟล์เลย์เอาต์ XML ที่มีองค์ประกอบ<RecyclerView>
หรือแบบเป็นโปรแกรม
หลักสูตรของ Udacity
เอกสารประกอบสำหรับนักพัฒนาแอป Android
ส่วนนี้แสดงรายการการบ้านที่เป็นไปได้สำหรับนักเรียน/นักศึกษาที่กำลังทำ Codelab นี้เป็นส่วนหนึ่งของหลักสูตรที่สอนโดยผู้สอน ผู้สอนมีหน้าที่ดำเนินการต่อไปนี้
- มอบหมายการบ้านหากจำเป็น
- สื่อสารกับนักเรียนเกี่ยวกับวิธีส่งงานที่ได้รับมอบหมาย
- ให้คะแนนงานการบ้าน
ผู้สอนสามารถใช้คำแนะนำเหล่านี้ได้มากน้อยตามที่ต้องการ และควรมีอิสระในการมอบหมายการบ้านอื่นๆ ที่เห็นว่าเหมาะสม
หากคุณกำลังทำ Codelab นี้ด้วยตนเอง โปรดใช้แบบฝึกหัดเหล่านี้เพื่อทดสอบความรู้ของคุณ
ตอบคำถามต่อไปนี้
คำถามที่ 1
ข้อใดต่อไปนี้คือ Layout Manager ที่ Android มีให้ เลือกได้มากกว่า 1 ข้อ
▢ LinearLayouManager
▢ GridLayoutManager
▢ CircularLayoutManager
▢ StaggeredGridLayoutManager
คำถามที่ 2
"ช่วง" คืออะไร
▢ ขนาดของตารางกริดที่สร้างโดย GridLayoutManager
▢ ความกว้างของคอลัมน์ในตารางกริด
▢ ขนาดของรายการในตารางกริด
▢ จำนวนคอลัมน์ในตารางกริดที่มีการวางแนวตั้ง
เริ่มบทเรียนถัดไป: