web analytics

Android Code : ทำ Adapter ของ ListView ให้เป็น MVP pattern

 

cover-2

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

บทความก่อนหน้านี้
http://benzneststudios.com/blog/android/refactoring-to-mvp-pattern-android/

ถ้ามีข้อผิดพลาด หรือมีจุดไหนที่ผิด รบกวนช่วยคอมเม้นไว้ด้วยนะครับ

 

เริ่มต้น

สิ่งที่เกี่ยวกับ Adapter ของ listView ก็จะมีหลักๆ 3 อย่าง ที่ปกติเราจะเขียนกัน
Custom view item layout (.xml)
Custom view item class (.java)
Adapter class (.java)

1

row_transaction.xml

 

RowTransactionView.java

 

TransactionAdapter.java

นี่คือการทำงานแบบปกติ เดี๋ยวเราจะมาลองทำ Adapter เป็นแบบ MVP pattern กัน

 

ปัญหาคือ Adapter รู้มากเกินไป

ตัว Adapter จากด้านบน มันสามารถเสก view ขึ้นมา มันเก็บข้อมูลได้ มัน set ข้อมูลลงไปใน view ได้ด้วย เดี๋ยวเราจะมาแบ่งหน้าที่มันออก เป็น  View กับ presenter

 

การทำงานของ AdapterPresenter จริงๆแล้ว สามารถเขียนได้หลายแบบ เท่าที่ผมดูจากชาวบ้านมา บางคนก็เขียนให้ 1 AdapterPresenter ทำงานกับทุก view แต่ก็มีแบบทำ AdapterPresenter เป็น Array หรือ HashMap แล้วให้ เป็น 1:1 เลยกับ view ก็ทำได้เหมือนกัน อยู่ที่ความซับซ้อนของ item และ type

ผมเห็นว่ากรณีตัวอย่างของผม คือมี type เดียว แบบง่ายๆ Presenter สามารถ bind view เพื่อ init ข้อมูล เสร็จแล้วก็ unbind ได้ ดังนั้นก็ทำตัวเดียวละกัน (หรือว่าเข้าใจผิดก็ไม่รู้)

 

สร้าง View

view ในที่นี้ก็คือตัว item ที่แสดงใน listView นั่นเอง

สร้าง interface class ของ View
IRowTransactionView.java

จากนั้นที่ คลาสของ Custom groupview ก็ implement ตัว interface

override พวก method setter

 

สร้าง Adapter Presenter

Adapter Presenter คือ ตัว presenter ที่ทำงานระหว่าง view (แถว layout) กับ model (ข้อมูลที่เตรียมจะแสดง)

ก่อนอื่นก็ต้องสร้าง Presenter ก่อน

สร้างคลาส interface ของ Adapter presenter

เป็นการระบุ method ที่ใช้งานใน adapter เช่น การกำหนดค่าข้อมูล

TransactionsAdapterPresenter.java

 

สร้างคลาส Adapter presenter ที่ implement

TransactionsAdapterPresenterImpl.java

Presenter จะต้องทำ 3 สิ่ง
เชื่อมกับ Model
เชื่อมกับ View
implement method

 

เชื่อมกับ Model

ในที่นี้ก็แล้วแต่ว่าจะเอา Model มาจากไหน ผมส่งผ่านด้วย method setter อาจจะไปดึงในฐานข้อมูลหรือเรียก service มาก่อน

 

 

เชื่อมกับ View

ประกาศตัวแปร view (interface) ใน PresenterImpl พร้อมกับ method สำหรับ bind/unbind view

 

Method ที่เกี่ยวข้อง

ใน AdapterPresenter หน้าที่หลักของมันคือ กำหนดค่าจาก model ไปใส่ใน view
ดังนั้น method init() ก็จะทำหน้าที่ส่วนนี้

 

กำหนด AdapterPresenter ใน Adapter

Adapter ของ listView ก็จะไม่ต้องทำงานส่วน set view แล้ว ไม่ได้เก็บ Model ไว้ด้วย โดย Model และการ set ข้อมูลจะโยนไปให้ presenter จัดการ

 

สรุป

ตัว Adapter จะรู้แค่ว่า สร้าง view แล้วให้ presenter เสร็จแล้วก็ return view กลับไป ให้ listview ซึ่ง Adapter ไม่ได้เก็บ Model ไว้ ทำให้ไม่รู้กระบวนการของการกำหนดค่า view นั่นเอง

 

Reference

https://medium.com/@jsuch2362/adapter-what-role-is-it-data-view-13c713cdae0b
https://github.com/kaedea/android-mvp-pattern