在我的应用中,我有一个搜索框,允许用户在键入时进行过滤。由于某些原因,我无法在执行过滤时正确显示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
旋转?
答案 0 :(得分:0)
invokeAndBlock
打开一个新线程,因此当您在单独的线程上访问UI组件时违反了EDT。
请尝试使用callSerially
将以下代码推迟到下一个EDT周期,但我不确定这会有什么帮助,因为在EDT上仍然会发生一切。
或者,我猜测方法isVisible
需要时间,因此您可以将该调用单独包含在invokeAndBlock
中。
要了解invokeAndBlock
,请查看开发者指南https://www.codenameone.com/manual/edt.html