在我的应用程序中,我有一个搜索框,允许用户在输入时进行过滤。由于某些原因,在执行筛选时,我无法正确显示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旋转?
发布于 2016-09-29 06:53:25
invokeAndBlock打开一个新线程,因此在单独的线程上访问UI组件时违反了EDT。
尝试使用callSerially来将下面的代码推迟到下一个EDT周期,尽管我不确定这会有帮助,因为EDT上的一切仍然在发生。
或者,我猜isVisible方法需要时间,所以您可以将该调用单独包含在invokeAndBlock中。
要了解invokeAndBlock,请参阅开发人员指南https://www.codenameone.com/manual/edt.html
https://stackoverflow.com/questions/39739186
复制相似问题