如何通过编程点击InfiniteContainer内的按钮?及容器重复问题解决
问题
我有一个包含InfiniteContainer(变量名bodyCnt)的表单,该容器内有3个子容器,所有子容器都配置了client属性。我尝试通过代码在bodyCnt中查找带有search_tag这个client属性的容器,用了这段代码:
while (n<20){ ((InfiniteContainer)cnt).continueFetching(); for (int i=0; i<cnt.getComponentCount();i++){ if (cnt.getComponentAt(i).getClientProperty(tag)!=null){ if (cnt.getComponentAt(i).getClientProperty(tag).equals(search_tag)){ cmp = cnt.getComponentAt(i); } } } n++; }
运行后发现最后一个容器在InfiniteContainer里重复出现(对应标红截图),同时我想知道怎么通过代码点击InfiniteContainer内的按钮。
解决方案
一、解决最后一个容器重复的问题
你强制循环调用20次continueFetching(),但InfiniteContainer加载完所有数据后,重复调用会触发重复渲染最后一组数据,这就是重复容器出现的原因。可以用以下两种方式优化:
- 按需加载,避免重复调用
利用InfiniteContainer的hasMore()和isLoading()方法,仅在还有数据可加载时调用加载方法,同时找到目标组件后提前终止循环:
while (((InfiniteContainer)cnt).hasMore() && !((InfiniteContainer)cnt).isLoading()) { ((InfiniteContainer)cnt).continueFetching(); // 异步加载需短暂等待完成,根据实际速度调整延迟 try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } // 遍历查找目标组件 for (int i = 0; i < cnt.getComponentCount(); i++) { Component comp = cnt.getComponentAt(i); Object propValue = comp.getClientProperty(tag); if (search_tag.equals(propValue)) { cmp = comp; break; } } // 找到目标后直接跳出外层循环 if (cmp != null) break; }
- 通过加载完成事件监听查找
更优雅的方式是监听InfiniteContainer的数据变化事件,在加载完成后执行查找逻辑:
InfiniteContainer infiniteCnt = (InfiniteContainer) cnt; DataChangedListener listener = (evt) -> { for (int i = 0; i < infiniteCnt.getComponentCount(); i++) { Component comp = infiniteCnt.getComponentAt(i); Object propValue = comp.getClientProperty(tag); if (search_tag.equals(propValue)) { cmp = comp; // 找到后移除监听器,避免重复触发 infiniteCnt.removeDataChangedListener(listener); break; } } }; infiniteCnt.addDataChangedListener(listener); // 触发初始加载 infiniteCnt.continueFetching();
二、编程点击InfiniteContainer内的按钮
找到目标容器后,遍历其内部组件,定位到按钮并调用click()方法即可:
// 假设已找到目标容器cmp for (int j = 0; j < cmp.getComponentCount(); j++) { Component innerComp = cmp.getComponentAt(j); if (innerComp instanceof Button) { Button targetBtn = (Button) innerComp; // 若有多个按钮,可通过client属性或文本进一步筛选 if ("target_btn".equals(targetBtn.getClientProperty("btn_tag"))) { targetBtn.click(); break; } } }
如果按钮直接在InfiniteContainer的子组件中,也可以在查找目标容器的同时直接检查并触发点击。
内容的提问来源于stack exchange,提问作者Daniel Tsai
相关产品推荐
相关产品推荐

