CodenameOne对容器集的过滤器优化

时间:2016-09-28 06:05:41

标签: asynchronous spinner codenameone

在我的应用中,我有一个搜索框,允许用户在键入时进行过滤。由于某些原因,我无法在执行过滤时正确显示InfinteProgress。 这是我的代码:

通过1

public void renderForumList(){
        try{
            magnify = mStateMachine.findForumSearchIcon(form);
        }catch(NullPointerException ex){
            System.out.println("User typed additional character in search term before previous term finished executing");
        }
        InfiniteProgress infi = new InfiniteProgress();
        magnify.getParent().replace(magnify, infi, null);
        Display.getInstance().invokeAndBlock(new Runnable() {
            @Override
            public void run() {
                for (int i = 0;i < containerStates.length;i++){
                    if(containerStates[i] != listItems[i].isVisible()){
                        listItems[i].setHidden(!containerStates[i]);
                        listItems[i].setVisible(containerStates[i]);
                    }
                }
                Display.getInstance().callSerially(new Runnable() {
                    @Override
                    public void run() {
                     mStateMachine.findForumsListComponent(form).animateLayout(200);
                    mStateMachine.findContainer2(form).replace(infi, magnify, null);
                    }
                });
            }
        });
}

在这个版本中,无限进度显示在正确的位置,但它不会旋转。

通过2

public void renderForumList(){
        try{
            magnify = mStateMachine.findForumSearchIcon(form);
        }catch(NullPointerException ex){
            System.out.println("User typed additional character in search term before previous term finished executing");
        }
        InfiniteProgress infi = new InfiniteProgress();
        magnify.getParent().replace(magnify, infi, null);
                for (int i = 0;i < containerStates.length;i++){
                    if(containerStates[i] != listItems[i].isVisible()){
                        listItems[i].setHidden(!containerStates[i]);
                        listItems[i].setVisible(containerStates[i]);
                    }
                }
        mStateMachine.findForumsListComponent(form).animateLayout(200);
        mStateMachine.findContainer2(form).replace(infi, magnify, null);
                    }
            }
}

在此版本中,放大镜图标只是短暂闪烁,但InfiniteProgress微调器永远不可见。

我在模拟器和Android设备上获得了相同的结果。

如何在搜索过程中让InfiniteProgress旋转?

1 个答案:

答案 0 :(得分:0)

invokeAndBlock打开一个新线程,因此当您在单独的线程上访问UI组件时违反了EDT。

请尝试使用callSerially将以下代码推迟到下一个EDT周期,但我不确定这会有什么帮助,因为在EDT上仍然会发生一切。

或者,我猜测方法isVisible需要时间,因此您可以将该调用单独包含在invokeAndBlock中。

要了解invokeAndBlock,请查看开发者指南https://www.codenameone.com/manual/edt.html