Codelab นี้เป็นส่วนหนึ่งของหลักสูตรพื้นฐานเกี่ยวกับ Kotlin ใน Android คุณจะได้รับประโยชน์สูงสุดจากหลักสูตรนี้ หากทํางานผ่าน Codelab ตามลําดับ Codelab ของหลักสูตรทั้งหมดจะแสดงอยู่ในหน้า Landing Page ของ Codelab ของ Android Kotlin Fundamentals
ข้อมูลเบื้องต้น
จุดแข็งอย่างหนึ่งของ RecyclerView
คือทําให้คุณใช้ผู้จัดการเลย์เอาต์เพื่อควบคุมและแก้ไขกลยุทธ์การออกแบบได้ LayoutManager
จัดการวิธีจัดเรียงรายการใน RecyclerView
RecyclerView
มาพร้อมกับตัวจัดการเลย์เอาต์พร้อมใช้งานสําหรับ Use Case ทั่วไป เช่น ใช้ LinearLayout
สําหรับรายการแนวนอนและแนวตั้ง หรือใช้ GridLayout
สําหรับตารางกริด สําหรับกรณีการใช้งานที่ซับซ้อนมากขึ้น คุณจะต้องใช้ LayoutManager
ที่กําหนดเอง
ใน Codelab นี้ คุณจะได้ศึกษาวิธีแสดงข้อมูลโดยใช้เลย์เอาต์ตารางกริดแทนรายการ ซึ่งสร้างขึ้นในแอปเครื่องมือติดตามการนอนหลับจาก Codelab ก่อนหน้า (หากไม่มีแอปจาก Codelab ก่อนหน้า ก็ดาวน์โหลดโค้ดเริ่มต้นสําหรับ Codelab นี้ได้)
สิ่งที่ควรทราบอยู่แล้ว
คุณควรทําความคุ้นเคยกับสิ่งต่อไปนี้
- การสร้างอินเทอร์เฟซผู้ใช้ขั้นพื้นฐานโดยใช้
Activity
,Fragments
และViews
- ไปยังส่วนต่างๆ ระหว่างส่วนย่อยและใช้
safeArgs
เพื่อส่งข้อมูลระหว่างส่วนย่อย - ดูโมเดล ดูโรงงานของโมเดล และการเปลี่ยนรูปแบบ
LiveData
และการสังเกตการณ์- วิธีสร้างฐานข้อมูล
Room
, สร้าง DAO และกําหนดเอนทิตี - วิธีใช้โครูทีนสําหรับงานฐานข้อมูลและงานที่ใช้เวลานานอื่นๆ
- วิธีใช้
RecyclerView
พื้นฐานด้วยAdapter
,ViewHolder
และเลย์เอาต์รายการ - วิธีใช้การเชื่อมโยงข้อมูลกับ
RecyclerView
- วิธีสร้างและใช้อะแดปเตอร์การเชื่อมโยงเพื่อเปลี่ยนรูปแบบข้อมูล
สิ่งที่คุณจะได้เรียนรู้
- วิธีใช้
LayoutManager
อื่นเพื่อเปลี่ยนวิธีแสดงข้อมูลในRecyclerView
- วิธีสร้างเลย์เอาต์ตารางกริดสําหรับข้อมูลการนอนหลับ
สิ่งที่คุณจะทํา
- สร้างจากแอปติดตามการนอนหลับจาก Codelab ก่อนหน้าในชุดนี้
- แทนที่รายการข้อมูลการนอนหลับที่
RecyclerView
แสดงในแอปด้วยตารางกริดข้อมูลการนอนหลับ
แอปติดตามการนอนหลับมี 2 หน้าจอที่แสดงด้วยส่วนย่อยดังที่แสดงในภาพด้านล่าง
หน้าจอแรกที่แสดงทางด้านซ้ายมีปุ่มสําหรับเริ่มต้นและหยุดติดตาม หน้าจอแสดงข้อมูลการนอนหลับของผู้ใช้บางส่วน ปุ่มล้างจะลบข้อมูลทั้งหมดที่แอปรวบรวมให้กับผู้ใช้อย่างถาวร หน้าจอที่ 2 ที่แสดงทางด้านขวาคือการเลือกคะแนนคุณภาพการนอนหลับ
แอปนี้ใช้สถาปัตยกรรมที่เรียบง่ายด้วยตัวควบคุม UI, โมเดลการดู และ LiveData
และฐานข้อมูล Room
เพื่อรักษาข้อมูลการนอนหลับไว้
ข้อมูลการนอนหลับจะแสดงใน RecyclerView
ใน Codelab นี้ คุณเปลี่ยนแอปเพื่อใช้ GridLayout
หน้าจอสุดท้ายจะมีลักษณะเหมือนกับภาพหน้าจอด้านล่าง
ใน Codelab ก่อนหน้า การเพิ่ม RecyclerView
ลงใน fragment_sleep_tracker.xml
เป็นการเพิ่ม LinearLayoutManager
โดยไม่มีการปรับแต่งใดๆ โค้ดนี้แสดงข้อมูลเป็นรายการแนวตั้ง
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
LinearLayoutManager
เป็นตัวจัดการเลย์เอาต์ที่พบบ่อยที่สุดและตรงไปตรงมาสําหรับ RecyclerView
และรองรับทั้งมุมมองแนวนอนและแนวตั้งของมุมมองย่อย ตัวอย่างเช่น คุณอาจใช้ LinearLayoutManager
เพื่อสร้างภาพหมุนของรูปภาพที่ผู้ใช้เลื่อนตามแนวนอน
เลย์เอาต์ตารางกริด
กรณีการใช้งานทั่วไปอีกแบบหนึ่งคือต้องแสดงข้อมูลจํานวนมากต่อผู้ใช้ ซึ่งคุณสามารถทําได้โดยใช้ GridLayout
GridLayoutManager
สําหรับ RecyclerView
จะวางข้อมูลเป็นตารางกริดแบบเลื่อนได้ดังที่แสดงด้านล่าง
จากมุมมองด้านการออกแบบ GridLayout
เหมาะที่สุดสําหรับรายการที่แสดงเป็นไอคอนหรือรูปภาพได้ เช่น รายการภายในแอปเรียกดูรูปภาพ ในแอปติดตามการนอนหลับ คุณจะแสดงการนอนหลับแต่ละคืนเป็นตารางไอคอนขนาดใหญ่ได้ การออกแบบนี้จะช่วยให้ผู้ใช้มองเห็นภาพรวมคุณภาพการนอนหลับได้อย่างรวดเร็ว
วิธีที่ GridLayout จัดวางรายการต่างๆ
GridLayout
จัดเรียงรายการในตารางแถวและคอลัมน์ สมมติว่าการเลื่อนในแนวตั้ง โดยค่าเริ่มต้น แต่ละรายการจะอยู่ในแถวเดียวจะใช้ "span." (ในกรณีนี้ ระยะเวลาหนึ่งจะเท่ากับความกว้างของคอลัมน์เดียว)
ในตัวอย่าง 2 รายการแรกที่แสดงด้านล่าง แต่ละแถวจะประกอบด้วยระยะเวลา 3 ช่วง โดยค่าเริ่มต้น GridLayoutManager
จะวางแต่ละรายการใน 1 ระยะเวลาจนถึงจํานวนระยะเวลาที่คุณระบุ เมื่อถึงขีดจํากัดของระยะเวลาแล้ว ระบบจะตัดคําไปยังบรรทัดถัดไป
โดยค่าเริ่มต้น แต่ละรายการจะใช้เวลา 1 ช่วง แต่คุณทําให้รายการกว้างขึ้นได้โดยระบุระยะเวลาที่จะครอบครอง เช่น รายการยอดนิยมในหน้าจอด้านขวาสุด (ดังที่แสดงด้านล่าง) จะใช้เวลา 3 ช่วง
ในงานนี้ คุณจะได้นําRecyclerView
ที่ฝึกเสร็จแล้วครั้งล่าสุดมาอัปเดตและแสดงข้อมูลเพื่อแสดงข้อมูลโดยใช้GridLayoutManager
คุณจะใช้แอปเครื่องมือติดตามการนอนหลับจาก Codelab ก่อนหน้านี้ต่อได้ หรือจะดาวน์โหลดแอป RecyclerViewGridLayout-Starter จาก GitHub ก็ได้
ขั้นตอนที่ 1: เปลี่ยน LayoutManager
- หากจําเป็น ให้ดาวน์โหลดแอป RecyclerViewGridLayout-Starter สําหรับ Codelab นี้จาก GitHub และเปิดโปรเจ็กต์ใน Android Studio
- เปิดไฟล์รูปแบบ
fragment_sleep_tracker.xml
- นําตัวจัดการเลย์เอาต์ออกจากคําจํากัดความของ
sleep_list
RecyclerView
รหัสที่จะลบ:
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager
- เปิด
SleepTrackerFragment.kt
- ใน
OnCreateView()
ก่อนคําสั่งreturn
ให้สร้างเลย์เอาต์แนวตั้งและบนลงล่างGridLayoutManager
ใหม่ที่มี 3 ระยะเวลา
เครื่องมือสร้าง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
มาพร้อมตัวจัดการเลย์เอาต์แบบทันทีสําหรับการใช้งานทั่วไป เช่นLinearLayout
สําหรับรายการแนวนอนและแนวตั้ง และGridLayout
สําหรับตารางกริด- สําหรับกรณีการใช้งานที่ซับซ้อนมากขึ้น ให้ใช้
LayoutManager
ที่กําหนดเอง - จากมุมมองด้านการออกแบบ
GridLayout
จะใช้ได้ดีที่สุดกับรายการที่สามารถแสดงเป็นไอคอนหรือรูปภาพได้ GridLayout
จัดเรียงรายการในตารางแถวและคอลัมน์ สมมติว่ามีการเลื่อนแนวตั้ง แต่ละรายการในแถวจะใช้สิ่งที่เรียก &&39; เรียกว่า "span."- คุณปรับแต่งระยะเวลาที่ครอบคลุมของรายการได้ สร้างตารางกริดที่น่าสนใจมากขึ้นโดยไม่ต้องใช้ตัวจัดการเลย์เอาต์ที่กําหนดเอง
- สร้างเลย์เอาต์รายการสําหรับสินค้า 1 รายการในตารางกริด และผู้จัดการเลย์เอาต์จะดูแลการจัดเรียงรายการ
- คุณสามารถตั้งค่า
LayoutManager
สําหรับRecyclerView
ในไฟล์เลย์เอาต์ XML ที่มีองค์ประกอบ<RecyclerView>
หรือแบบเป็นโปรแกรม
หลักสูตร Udacity:
เอกสารประกอบสําหรับนักพัฒนาซอฟต์แวร์ Android
ส่วนนี้จะอธิบายการบ้านและรายงานสําหรับนักเรียนที่ทํางานผ่าน Codelab นี้ซึ่งเป็นส่วนหนึ่งของหลักสูตรที่นําโดยผู้สอน สิ่งที่ผู้สอนต้องทํามีดังนี้
- มอบหมายการบ้านหากจําเป็น
- สื่อสารกับนักเรียนเกี่ยวกับวิธีส่งงานทําการบ้าน
- ตัดเกรดการบ้าน
ผู้สอนจะใช้คําแนะนําเหล่านี้เท่าใดก็ได้หรือตามที่ต้องการก็ได้ และสามารถกําหนดให้การบ้านอื่นๆ ที่ตนคิดว่าเหมาะสมได้
หากคุณใช้ Codelab ด้วยตัวเอง ก็ให้ใช้การบ้านเพื่อทดสอบความรู้ของคุณได้
ตอบคําถามเหล่านี้
คำถามที่ 1
ข้อใดต่อไปนี้คือผู้จัดการเลย์เอาต์ที่ Android มีให้ เลือกได้มากกว่า 1 ข้อ
▢ LinearLayouManager
▢ GridLayoutManager
▢ CircularLayoutManager
▢ StaggeredGridLayoutManager
คำถามที่ 2
"span"?
▢ ขนาดของตารางกริดที่สร้างโดย GridLayoutManager
▢ ความกว้างของคอลัมน์ในตารางกริด
▢ ขนาดของรายการในตารางกริด
▢ จํานวนคอลัมน์ในตารางกริดที่มีการวางแนวตั้ง
เริ่มบทเรียนถัดไป: