HỎI Cách load dữ liệu lớn: Room + LiveData + Paging + Custom Adapter

Bui Minh Phong

New Member
26/1/15
11
0
1
Chào các bạn,

Mình đang gặp vấn đề trong app như sau:

- Cần hiển thị một list dài, dữ liệu của mỗi item phức tạp, được join từ nhiều table.
- Khi lấy được dữ liệu, cần group theo một điều kiện để tạo UI phân cấp: item cha, list item con, có thể collapse, expand.

Hướng xử lý:

1. Với dữ liệu nặng và phức tạp, mình định dùng Paging 3 để phân trang, load sẽ nhanh hơn nhưng nếu dùng Paging 3 thì adapter là PagingDataAdapter làm sao để custom được việc collapse, expand?

2. Load toàn bộ data lên thì thời gian rất lâu, UI sẽ bị trống trong một khoảng thời gian dài. Với cách này thì mình có được list data, có thể group by và dùng thư viện FlexibleAdapter.

--> Các bạn có thể giúp mình một vài solution không ạ.
Cảm ơn các bạn.

UI của app như sau:

 

Joe

Thành viên VIP
21/1/13
2,951
1,318
113
I don't think that you could get a "ready-for-use" solution (such as FlexibleAdapter ) without having to pay some heavy load. I've looked into the mentioned package and I would say that the implementation is too awkward, too big for your app. As a developer you should try to invent your own solution that suits more to your approach than any generic solution so that you are less dependent from the others, in particularly the free APIs because they are usually unsupported or buggy.
So far I could understand your problem which is a complex combination of different tables and the data are huge for an upload of the whole. If so, the best solution is to prepare the huge data in background (in parallel using Stream or Pool) then divide them into pages for an upload on demand. Meaning: depending on which screen wipe effect (left, right, up or down) a certain number of pages is uploaded while the preparation of the rest is still on processing in background. Again: it depends on your IT experiences.
 

Bui Minh Phong

New Member
26/1/15
11
0
1
Cảm ơn Joe vì đã trả lời.
Tôi sử dụng thư viện FlexibleAdapter + cách load toàn bộ dữ liệu lên vì hiện tại đây là giải pháp tốt nhất giúp tôi hoàn thành công việc.

Quay lại với vấn đề tôi muốn thảo luận xin giải pháp:
Tôi cần tải dữ liệu phân trangrealtimephân cấp, do đó tôi sử dụng Paging 3 + LiveData thì giải quyết được việc tải dữ liệu, nhưng lên đến tầng View thì không có cách nào để group các phần tử và tôi chưa biết cách custom PagingDataAdapter hỗ trợ UI collapse, expand.

Code sẽ trông như thế này:

Dao
Code:
@Query
fun getData(): PagingSource<Int, Data>
ViewModel
Code:
fun getData(): LiveData<PagingData<Data>> {
    return Pager(PagingConfig(pageSize = 20)) {
        dao.getData()
    }.liveData
}
View (Fragment)
Code:
viewModel.getData().observe(viewLifecycleOwner) {it: PagingData<Data> ->
    // TODO
}
Dữ liệu cuối cùng mà tôi nhận được là PagingData<T>, làm sao có thể group và đưa vào Adapter (phải dùng kèm với PagingDataAdapter), hỗ trợ được collapse, expand.
Đây là vấn đề mà tôi gặp phải khi dùng giải pháp này.

Cảm ơn Joe.