尝试稍等一下然后刷新适配器

时间:2016-11-14 21:42:19

标签: android multithreading animation android-recyclerview adapter

在我的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后启动它,然后它会在它向前移动一秒钟之前挂起它,并且当它执行时,它不会执行任何动画并直接跳转到最终结果。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

问题是您在Thread而不是start()上拨打postDelayed(Runnable, long)

或者,您可以使用主线程中的处理程序new Handler() .postDelayed(new Runnable(){ public void run(){ refreshAdapters(); } }, 1000); 来实现您在较少代码中尝试执行的操作:

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

或者

list_b = ['04/Sep/2016:00:00:03 -0400', '04/Sep/2016:00:00:04 -0400', '04/Sep/2016:00:00:05 -0400',
          '04/Sep/2016:00:00:06 -0400', '04/Sep/2016:00:00:06 -0400', '04/Sep/2016:00:00:08 -0400',
          '04/Sep/2016:00:00:08 -0400', '04/Sep/2016:00:00:08 -0400', '04/Sep/2016:00:00:11 -0400',
          '04/Sep/2016:00:00:15 -0400', '04/Sep/2016:00:00:19 -0400', '04/Sep/2016:00:00:20 -0400',
          '04/Sep/2016:00:00:23 -0400', '04/Sep/2016:00:00:25 -0400', '04/Sep/2016:00:00:26 -0400']

duplicates = set()

for i in list_b:
    indices = [pos for pos, s in enumerate(list_b) if s == i]
    if len(indices) > 1:
        duplicates.add("%s Ammount of duplicates: %d Index of duplicates: %s" % (i, len(indices), indices))

for dup in duplicates:
    print(dup)