高效更新 RecyclerView Grid 或以其他方式显示 Complex Grid

Efficiently update RecyclerView Grid or otherwise Display Complex Grid

我使用 RecyclerView 显示了一个像素网格(如图所示)。按下按钮时,大部分像素将改变颜色。我希望这个更新能够更统一地处理每个像素的颜色变化,即使它需要很长时间才能完成(可能有几十万个像素)而不阻塞主线程。这怎么可能?

如果可能的话,我希望单个像素的变化流畅。这里最重要的不是快速而是顺利地完成动作。如果这不是最佳选择,我不会依附于 RecyclerView - 我只是相信它会更好地提高性能。我不需要细胞的任何类型的听众。最终,单元格将变得更加复杂,每个单元格都包含其他单元格(具有背景颜色的分层视图)。我将使用 SQL 数据库和 Room 库进行数据存储和编辑。

该进程应该在后台线程上进行,以免停止 UI。目前我正在通过按钮的 onClickListener 上的 myRecyclerAdapter.notifyItemChanged(i); 更新我的 RecyclerView,我的 UI 将在它完成时停止。

您可以做的是一个一个地更新您要更新的单元格。然后打电话 notifyDataSetChanged。 可以找到示例 here.

如果遇到渲染问题,请尝试 requestLayout and forceLayout

我建议阅读 this answer 以更好地了解后台发生的事情。

试试 CustomView,有充分的理由使用 CustomView 来创建标准小部件未提供的视图。您应该能够使用后台线程来实现每次转换之间的时间同步或延迟,以使其 smooth.And 使用 runOnUiThread() 方法更改 ui 即像素颜色。例如- 你可以尝试这样的东西-

 Runnable onAnimationStarted=new Runnable() {
            @Override
            public void run() {
            //change ui
            }
        };
Runnable onAnimationStopped=new Runnable() {
            @Override
            public void run() {
            //change ui
            }
        };
       Thread thread = new Thread(){
                @Override
                public void run() {
    runOnUiThread(onAnimationStarted);
              long start= System.currentTimeMillis();;
              while(System.currentTimeMillis()-start<1000) //waits one second
            {

            };
    runOnUiThread(onAnimationStopped);                 
        }

        };
            thread.start();