Viewの更新で躓く
前回の記事で一通りの問題は解決したので、ひたすらRepositoryにDB処理を移設するだけかと思いきやまたも問題が。
Swipe削除のMVP化までコミットしました。
Presenter → Repository へと対象のIndexをもつRealmDB削除の要求。
Repository → Presenter へと結果の返却。
ここまでくるとやってることは単純作業と化すのですが、
Presenter → View へと画面更新の指示である
@Override
public void notifyItemRemoved(int index) {
mAdapter.notifyItemRemoved(index);
}
を通知しても罫線(DividerItemDecorationで実装)が残ってしまいます。
明らかにRecyclerViewが上手く更新されていない。
ItemTouchHelper.SimpleCallbackで躓く
本アプリのリストスワイプ削除は ItemTouchHelper.SimpleCallback
を匿名クラスで実装することで実現しています。
なので本来は
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
int index = viewHolder.getAdapterPosition();
// リストのスワイプ削除イベント
mPresenter.onSwiped(index);
→ココ mAdapter.notifyItemRemoved(index);
}
でViewの更新を促すのが正解なのですが、それではMVP化として美しくない(えっ
というか仮に正規の場所でnotifyItemRemovedをコールしても、結果が同じだったのです。
躓いた原因を取り除く
よくよく考えてみるとnotifyItemRemovedをコールしているmAdapter(PersonAdapter)ですが、こいつの生成はPersonPresenterが
@Override
public void showList(RealmList<Person> personList) {
mAdapter = new PersonAdapter(mActivity, personList, this);
mRecyclerView.setAdapter(mAdapter);
}
をコールする時に行っています。
明らかにAdapterの生成と更新のタイミングがよろしくない
匿名クラスでスワイプ削除イベントを拾っているというのに、チグハグな実装になっています。
という訳で、次回はここらへんをフォーカスしてバグを取り除いていきましょう。
(フラグになると分かっていて次回予告をするんですよね、やめられない。)