質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.37%

RecyclerViewのonSwipedに削除処理を入れていたら違うところも消える

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,216

SmartBuzz

score 81

RecyclerViewにスワイプで削除するという処理を入れています。

@Override
public void onClick(view v){
        //RecyclerView導入部分
        RecyclerView recyclerView = (RecyclerView)findViewById(R.id.list_test);
        recyclerView.setHasFixedSize(false);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.addItemDecoration(new DividerItemDecoration(context));
        adapter = new MyCollectionTestListAdapter(context,testList);
            ItemTouchHelper itemDecor = new ItemTouchHelper(
                    new ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP | ItemTouchHelper.DOWN,
                            ItemTouchHelper.RIGHT) {
                        @Override
                        public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
                            final int position = viewHolder.getAdapterPosition();
                            final int toPosition = target.getAdapterPosition();
                            moveTest(position,toPosition);
                            StockPosition = position;
                            adapter.notifyItemMoved(position, toPosition);
                            return true;
                        }

                        @Override
                        public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
                            final int position = viewHolder.getAdapterPosition();
               deleateTest(testList.get(position).getId(),position);
                        }

                        @Override
                        public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
                            super.onSelectedChanged(viewHolder, actionState);
                            dragStartPosition = StockPosition;
                        }

                        @Override
                        public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder target){
                            onResume();
                        }
                    });
            itemDecor.attachToRecyclerView(recyclerView);
}

onSwipedの中で、deleateTestメソットに対して、削除されたポジションをintで渡してこのメソットがDB上のカラムを削除して、再描画して削除した状態を表示する。というような流れで作っています。

private void deleateTest(final int test_id,final int position){
        final Activity activity = this;

        new Thread(new Runnable() {
            @Override
            public void run() {
                TestCollectorDatabase db = ((TestCollector) getApplication()).getTestCollectorDatabase();
                testList = db.deleteMylistTest(test_id, collection_id);

                activity.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {

                        // 画面更新
                        updateData(activity);
                        adapter.notifyItemRemoved(position);
                    }
                });
            }
        }).start();
    }


この中で、新しいスレッドでデータベースのカラム削除処理をして、その後に、updateDataでこのクラスが持っているListをデータベースから撮ってきて最新の状態にしてから、notifyItemRemovedでRecyclerViewの表示を更新するために読んでます。

しかし、現状

■が内容が入っている。□が内容が入っておらず白地、で表すと。





■←一番下をスワイプして削除すると





とります。ただ、データベース上からは3列目は消えていないので、1回違うアクティビティに画面遷移してからもう一度見ると




と表示されます。
こうなる原因としては、notifyDataSetChangedはリストの表示を更新するという認識で使っているのですが、表示させる順番が悪いのでしょうか…?
Adapter内にログを仕込んで、データのカウントをとってみましたが、全て出したい数分だけで表示されているので、データが悪いのではなく表示部分の何かが悪いのかな?と思っています。

どうすればスワイプした際に違うところが消えなくなるのか教えてください。
よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

check解決した方法

0

newした後に

recyclerView.getRecycledViewPool().setMaxRecycledViews(0,0);


を追記して、ViewHolderにViewをプールしない様に書いてやると解決しました。
RexyclerViewなのに本末転倒な感じがして気持ち悪いですが、一旦これで解決とします。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

onSwipedに

notifyItemRemoved


を追加してみたらどうでしょう

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/16 09:29

    追加してみましたが、ダメでした…。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る