1

RecyclerViewには、アイテムの削除、追加、または変更時に再生されるデフォルトのアニメーションがあります。ちょっと待ってからアダプタをリフレッシュする

しかし、RecyclerViewがまだアニメーションの途中にあると考えていると時間がたつと更新されない場合があるので、アイテムに追加の変更を加えるのは面倒です。

私はちょっと待ってから、アダプターの最終更新を呼び出して、実際にそれらの変更が行われたことを確認したかったのです。 sleepコマンドは、まだメインスレッドを占有しているように見える何らかの理由しかし

new Thread(new Runnable() { 
    @Override 
    public void run() { 
     try { 
      Thread.sleep(1000); 
     } 
     catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     activity.runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       refreshAdapter(); 
      } 
     }); 
    } 
}).run(); 

は、私はこれを試してみました!私はDialogFragmentでOKを押した後に起動し、何かを前に進める前に少しだけハングアップしています。その時までに、アニメーションを一切やっておらず、最終結果にまっすぐジャンプします。

これを修正するにはどうすればよいですか?

+0

はrefreshAdapter()が何をするのでしょうか? "OK"ボタンを押した後の動作は何ですか? データセットの変更はどこでどこで行われましたか? – c0rtexx

+0

あなたのスレッドで.start()を呼び出してください。.run() – Guardanis

答えて

3

Threadにはrun()が、start()には電話されていません。

また、あなたがより少ないコードで何をしようとして達成するために、メインスレッドからハンドラのpostDelayed(Runnable, long)を使用することができます。

new Handler() 
    .postDelayed(new Runnable(){ 
     public void run(){ 
      refreshAdapters(); 
     } 
    }, 1000); 

それとも

new Handler() 
    .postDelayed(() -> refreshAdapter(), 
     1000); 
+0

それはうまくいきました。なぜスタートは動作するのですか? – KaliMa

+0

'Thread'クラスは、' Runnable'を実装しています。このクラスは、コンストラクタで指定した 'Runnable'に委譲します。 'start()'を呼び出すことは新しいスレッドを実際に開始するものです。新しいスレッドは 'run()'の固有の実装を呼び出し、 'run()'(これはあなたの 'refreshAdapterそれでも新しいスレッドに。単に 'run()'を呼び出すだけであれば、作成した同じスレッドで効果的に実行することができます。 – Guardanis

関連する問題