鐵人賽快到尾聲了,今天想介紹在控制 RecyclerView 中回饋按鈕時,遇到的狀況。想想,這篇好像應該和前一篇順序對調,畢竟是先有這些糾結,才有後面自己歸納出的那些寫法。所以先暫時忘掉昨天的寫法,回到 MVVM 的初學者吧。
大家覺得 Adapter 應該屬於 View 層或是 ViewModel 層呢?
第一次寫 MVVM 搭配 RecyclerView,突然不知道要怎麼用,爬了網路上的文章後,卻又更更更混亂了。
可以先看一下這兩篇:
取自第一篇的整理,網路上的寫法大致上有三種
我後來又爬了多文章和範例,也和朋友討論過,還是覺得 Adapter 負責資料的顯示應該屬於 View,而我實作的方法偏第 2 種。下面附上我的程式碼:
private final Observer<ArrayList<Chat>> mChatListUpdateObserver = new Observer<ArrayList<Chat>>() {
@Override
public void onChanged(ArrayList<Chat> chatArrayList) {
OptionClickCallback optionClickCallback = new OptionClickCallback() {
@Override
public void onOptionClick(Option option) {
mViewModel.sendOptionMessage(option, categoryId);
}
@Override
public void noneOfAbove(Option option) {
mViewModel.sendOptionMessage(option, categoryId);
}
};
ChatAdapter mChatAdapter = new ChatAdapter(ChatActivity.this, chatArrayList, optionClickCallback);
mRecyclerView.setLayoutManager(new LinearLayoutManager(ChatActivity.this));
mRecyclerView.setAdapter(mChatAdapter);
mRecyclerView.scrollToPosition(mChatAdapter.getItemCount() - 1);
mProgressLayout.setVisibility(View.GONE);
}
};
我是在聊天紀錄的 Observer 裡,只要聊天紀錄有變動,就重新生成 Adapter 和提供更新後的聊天紀錄。
既然已經決定 Adapter 屬於 View,我遇到的第二個問題是當 Adapter 要怎麼和 ViewModel 互動?
我的案例是回饋按鈕被點擊後,需要使用 ChatViewModel
中的 sendOptionMessage()
,要怎麼呼叫呢?
我不確定第一種作法,將 ViewModel 當參數傳來傳去好不好,不過我自己不是很喜歡。所以,後來是選用第 3 種方式。
這個問題,我也不確定作法好不好,如果你有什麼想法歡迎留言討論哦!!