0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

日記アプリのMVP化工程記録・5

Posted at

Viewの更新で躓く

前回の記事で一通りの問題は解決したので、ひたすらRepositoryにDB処理を移設するだけかと思いきやまたも問題が。

Swipe削除のMVP化までコミットしました。

Presenter → Repository へと対象のIndexをもつRealmDB削除の要求。
Repository → Presenter へと結果の返却。

ここまでくるとやってることは単純作業と化すのですが、
Presenter → View へと画面更新の指示である

PersonFragment
    @Override
    public void notifyItemRemoved(int index) {
        mAdapter.notifyItemRemoved(index);
    }

を通知しても罫線(DividerItemDecorationで実装)が残ってしまいます。
明らかにRecyclerViewが上手く更新されていない。

ItemTouchHelper.SimpleCallbackで躓く

本アプリのリストスワイプ削除は ItemTouchHelper.SimpleCallback を匿名クラスで実装することで実現しています。
なので本来は

PersonFragment
                    @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が

PersonFragment
    @Override
    public void showList(RealmList<Person> personList) {
        mAdapter = new PersonAdapter(mActivity, personList, this);
        mRecyclerView.setAdapter(mAdapter);
    }

をコールする時に行っています。

明らかにAdapterの生成と更新のタイミングがよろしくない

匿名クラスでスワイプ削除イベントを拾っているというのに、チグハグな実装になっています。

という訳で、次回はここらへんをフォーカスしてバグを取り除いていきましょう。
(フラグになると分かっていて次回予告をするんですよね、やめられない。)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?