2016-09-30 17 views
3

MVPでリサイクラビューを使用しているときに、リストの参照はどこで行いますか?私はChatManagerを持っており、それは異なるプレゼンターと話すことができます。私はChatManagerに1つ、Presenterに2つのメッセージリストを保管しています。アダプター、ビュー、およびプレゼンターは同じリストを共有します。 Presenterのメッセージのリストへの参照がある理由は、プレゼンターから処理したいスクロールと削除のためのビジネスロジックがあるからです。MVPを使用してRecyclerViewからアイテムを挿入/削除する方法

メッセージを削除する必要があるとき、プレゼンターは削除するアイテムを決定し、リストから削除します。メッセージが削除されたことをビューに伝える必要があります。その場合、view.remove(message)またはview.remove(index)と表示されますか?プレゼンターが既にそれを行っているので、ビューはメッセージを再試行してはいけません。

スクロールや追加など他の操作でも同じです。新しいメッセージが受信された場合、プレゼンターはをallMessagesに追加し、ビューを更新する必要があります。理想的には、プレゼンターはview.onMessageReceived(int newMessagesCount, int indexAddedAt)の代わりにview.onMessagesReceived(List<Message> messages)を呼び出す必要があります。 2番目の方法は本当に奇妙で、冗長ではありません。しかし、リストは共有されているので、ビューはnotifyItemInsertedを呼び出すだけでよく、したがってカウントとインデックスについて知る必要があります。

これを処理する最善の方法は何ですか?

+0

私はそのようにやった:私は、プレゼンターのビューにコピーする必要がデータのリストを格納しません。 (モデルから)何かが変更されたとき、私は 'view.changeData()'を呼び出すことができ、あなたのアクティビティ/フラグメントは 'presenter.getData()'によってデータにアクセスできます。 (Add、Edit、Remove)のような変更を加えた後に、 –

+0

@ akshayt23 @ akshayt23最初にデータリストview.onMessagesReceived(リストメッセージ)を設定することができます。 )オプションはnotifyItemInserted(int lastPostion)のように流れますEdit NotifyItemChanged(int position)一意のidでメッセージから位置を取得delete同じ –

答えて

0

のベストプラクティスのようなビューの実装からアダプタのリストを更新することですが、このタスクのための関数は(例えばフラグメントまたは活性)ビューインターフェイス上にある、ビューの実装で実装する必要があり

まずアダプタにメソッドを追加

public void updateItemsList(ItemsList itemsList) 
{ 
    //update the list of your items assume your items list is named "mItemsList" 
    this.mItemsList = itemsList; 
    notifyDataSetChanged(); 
} 

の下に、あなたのビューインタフェースでのようなアダプタのリストを更新するためのメソッドを追加

public void updateAdapterList(ItemsList itemsList); 

番目以下あなたのビューの実装(フラグメントまたは活性)ENは、これを追加します。

@Override 
public void updateAdapterList(ItemsList itemsList); 
{ 
    //update the adapter list -- assume your adapter is named "mAdapter" 
    mAdapter.updateItemsList(itemsList); 
} 

は今、あなたは、このメソッドにアクセスすることができます(updateAdapterList())あなたはタイプ・ビュー・インタフェースのオブジェクトを持っているところはどこでも。

2

Amirが示唆しているように、アダプタのメソッドを公開してデータを更新する方法と、notifyDataSetChangedを呼び出します。アダプタにメッセージを追加/更新したいだけのときに、データセット全体を不必要に更新するので、このメソッドを使用することは本当にありませんでした。

もう1つの方法は、ビュー内にメソッドaddNewMessages(int count, int index)を公開することでした。アダプタが挿入/更新を通知するインデックスを知るようにしました。これは、APIが奇妙に見えるためです。addNewMessagesは実際にインデックスとカウントの代わりに新しいメッセージのリストを渡しました。私が一緒に行った

ソリューションは、実際には最終的にAdapterに渡しPresenterからViewに全体の更新リストを渡すことでした。 AdapterDiffUtilを使用して古いリストと新しいリストの差分を計算し、毎回notifyDataSetChangedではなくnotifyItemInserted/notifyItemChangedのメソッドのみを呼び出します。

これは今APIは次のようになりますので役立ちます。

ChatPresenter { 
    interface View { 
    ... 
    void updateMessages(List<Message> messages); 
} 

Activity implements ChatPresenter.View { 
    ... 
    @Override 
    void updateMessages(List<Message> messages) { 
     chatsAdapter.update(messages); 
    } 
} 

ChatsAdapter { 
    ... 
    public update(List<Message> messages) { 
     DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new ChatMessageDiffCallback(this.messages, updatedMessages)); 

     this.messages = updatedMessages; 
     diffResult.dispatchUpdatesTo(this); 
    } 
} 
関連する問題