1

在我的RecyclerView中,当您移除,添加或更改项目时,会播放默认动画。尝试等待一会儿,然后刷新适配器

但是,对项目执行其他更改会很烦人,因为如果它仍然认为RecyclerView处于动画中间,它有时会不及时更新。

所以我想稍微等一下,然后调用适配器的最终更新以确保做出这些更改。

我尝试这样做:

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()呢? 按下“确定”按钮后,您期望的行为是什么? 数据集的更改在哪里和哪里完成? – 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