2017-12-13 10 views
1

リストからアイテムを削除しようとしていますが、notifyItemRemoved()メソッドは動作しません。最後のアイテムを削除して配列のインデックスを外してしまいます。それに非常に次の項目を削除しますが、スレッドの外 その作業罰金をコードを置けば私のコードnotifyからのnotifyItemRemoved()はrecyclerviewで機能していないスレッド

 Runnable runnable = new Runnable() { 
     @Override 
     public void run() { 

      int progress = 0; 
      ArrayList<MediaFileObject> selection = localDatabase.getAllMediaObjectsOfID(list.get(selectedAlbum).getId()); 
      for (MediaFileObject obj : selection) { 
       if (searializeableTasks.isCancelled()) 
        break; 
       localDatabase.moveMediaObjectToTrash(obj); 
       progress++; 
       if (searializeableTasks.isCancelled()) 
        sendProgressToHandle(-101); 
       else 
        sendProgressToHandle(progress); 
      } 
      if (!searializeableTasks.isCancelled()) 
       localDatabase.deleteAlbum(list.get(selectedAlbum).getId()); 

      Handler handler = new Handler(getMainLooper()); 
      handler.post(new Runnable() { 
       @Override 
       public void run() { 

        list.remove(selectedAlbum); 
        savedAlbumAdapter.notifyItemRemoved(selectedAlbum); 

       } 
      }); 


     } 
    }; 

    searializeableTasks.startTasks(localDatabase.getAllMediaObjectsOfID(list.get(selectedAlbum).getId()).size(), runnable); 

しかし、もし私が私を入れています予想通り、メインスレッド(クラス)その作業罰金内のすべてのコードを置くがありますここにコードしてください私は自分のカスタム進捗ダイアログを完成した後に表示したいと思っています。RecyclerView誰かが私を助けてくれますか?私のコードで何が間違っていますか?なぜ別のスレッドで動かないのですか?

+1

'notifyDataSetChanged();'のみを使用して動作します。 – Dharmishtha

+0

現在、私はこれをやっています 'Handler handler = new Handler(Looper.getMainLooper()); (); list.clear(); list.clear(); list.clear();リストを削除します。 notifyDataSetChanged()に対してnotifyItemXメソッドを使用する方が良いです。addAll(localDatabase.getAllAlbums()); savedAlbumAdapter.notifyDataSetChanged();}}); ' –

答えて

0

使用this-:

代わりの

savedAlbumAdapter.notifyItemRemoved(selectedAlbum); 

ツー:

notifyDataSetChanged(); 
+0

notifyDataSetChanged特に大きいデータセットではよりスムーズです – donfuxx

1

コールがメインスレッドに通知します。

runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      savedAlbumAdapter.notifyItemRemoved(selectedAlbum); 
     } 
    }); 

それとも

yourrecyclerView.post(new Runnable() { 
     @Override 
     public void run() { 
      savedAlbumAdapter.notifyItemRemoved(selectedAlbum); 
     } 
    }); 
+0

現在、私はこれをやっています 'Handler handler = new Handler(Looper.getMainLooper()); handler.post(新しいRunnableを(){ @Override公共ボイドラン(){ Log.e( "sizes4" はlist.size()+ "" + savedAlbumAdapter.getItemCount()); list.clear( ); list.addAll(localDatabase.getAllAlbums()); savedAlbumAdapter.notifyDataSetChanged(); }})。 ' –

+0

ローカルリストからアイテムを削除する必要がありますか? 'list.remove(selectedAlbum); ' –

+0

いいえ。 Ui操作の場合のみ。 – ADM

0

使用あなたがremove()notifyItemRemoved()を使用work.Ifのみ

notifyDataSetChanged(); 

それはそれはもうそうExceptionが発生し、次の位置を削除しようとします。

+1

notifyDataSetChangedのドキュメントを読んだことがありますか?https://developer.android.com/reference/android/ support/v7/widget/RecyclerView.Adapter.html#notifyDataSetChanged() 'アダプタを作成している場合、できるだけ具体的な変更イベントを使用する方が効率的です。最後の手段としてnotifyDataSetChanged()を使用します。 – donfuxx

+0

現在、私はこれをやっていますが、アニメーションはこのメソッドでは機能せず、すべてのアイテムを再度リロードします。 –

+0

ok notify notemitemRemoved()のみを使用します。UIスレッドで使用する – Dharmishtha

関連する問題