codenameone中设备上的下拉错误

codenameone中设备上的下拉错误,codenameone,Codenameone,我正在我的应用程序中实现落水淹没功能。它是使用包含元素列表的容器实现的。 假设下拉列表中有以下项目aa1、aa2、aa3、aa4、aa5等。若我搜索为“aa”,它会显示从“aa”开始的项目,若我从列表中选择aa5,它会接受aa1并显示它。但是,如果我滚动项目并选择其工作良好。这个问题只发生在iOS设备上,在模拟器上工作得很好。 第一张图片描述了下拉列表的样子,在第二张图片中,如果我搜索“ee”,它会给出以“ee”开头的项目列表。如果我选择“ee5”,它将设置为ee1,如图3所示。问题只出现在设备

我正在我的应用程序中实现落水淹没功能。它是使用包含元素列表的容器实现的。 假设下拉列表中有以下项目aa1、aa2、aa3、aa4、aa5等。若我搜索为“aa”,它会显示从“aa”开始的项目,若我从列表中选择aa5,它会接受aa1并显示它。但是,如果我滚动项目并选择其工作良好。这个问题只发生在iOS设备上,在模拟器上工作得很好。 第一张图片描述了下拉列表的样子,在第二张图片中,如果我搜索“ee”,它会给出以“ee”开头的项目列表。如果我选择“ee5”,它将设置为ee1,如图3所示。问题只出现在设备上。有解决办法吗

所以,请让我知道这有什么问题

谢谢

[![在此处输入图像描述][1][1]

//使用多按钮实现的新代码

final String[] listItems = model.getItems();

        Display.getInstance().callSerially(() ->{

                multiButton= new MultiButton();
                multiButton.setTextLine1(s);

                dialog.add(multiButton);
                multiButton.addActionListener(e -> Log.p("you picked " + multiButton.getSelectCommandText(), Log.ERROR));

            }
            dialog.revalidate();
        });

我建议使用
容器
和简单的布局搜索,如下面的代码所示。以下代码取自:


那代码看起来怎么样?这些是您编写的组件,而不是内置组件,因此我假设在这一过程中会发生一些事情failed@ShaiAlmog,我添加了实现此功能的代码。如果我设置itemList.setFireOnClick(true),它从列表中选择第一项。但如果为false,则会在单击两次后选择该项目。请为此提供任何解决方法。谢谢,我要找的是过滤代码,你说这个bug就在这里。您似乎正在使用
列表
,尽管我们建议您避免使用它@ShaiAlmog感谢您的解决方案。我现在使用Multibutton实现,但每当我从下拉列表中选择项时,它只返回我上次输入的值。我用于实现的代码如下。之所以发生这种情况,是因为您将所有按钮存储到一个全局按钮,而不是使用新按钮的本地引用。
final String[] listItems = model.getItems();

        Display.getInstance().callSerially(() ->{

                multiButton= new MultiButton();
                multiButton.setTextLine1(s);

                dialog.add(multiButton);
                multiButton.addActionListener(e -> Log.p("you picked " + multiButton.getSelectCommandText(), Log.ERROR));

            }
            dialog.revalidate();
        });
Image duke = null;
try {
    duke = Image.createImage("/duke.png");
} catch(IOException err) {
    Log.e(err);
}
int fiveMM = Display.getInstance().convertToPixels(5);
final Image finalDuke = duke.scaledWidth(fiveMM);
Toolbar.setGlobalToolbar(true);
Form hi = new Form("Search", BoxLayout.y());
hi.add(new InfiniteProgress());
Display.getInstance().scheduleBackgroundTask(()-> {
    // this will take a while...
    Contact[] cnts = Display.getInstance().getAllContacts(true, true, true, true, false, false);
    Display.getInstance().callSerially(() -> {
        hi.removeAll();
        for(Contact c : cnts) {
            MultiButton m = new MultiButton();
            m.setTextLine1(c.getDisplayName());
            m.setTextLine2(c.getPrimaryPhoneNumber());
            Image pic = c.getPhoto();
            if(pic != null) {
                m.setIcon(fill(pic, finalDuke.getWidth(), finalDuke.getHeight()));
            } else {
                m.setIcon(finalDuke);
            }
            hi.add(m);
        }
        hi.revalidate();
    });
});

hi.getToolbar().addSearchCommand(e -> {
    String text = (String)e.getSource();
    if(text == null || text.length() == 0) {
        // clear search
        for(Component cmp : hi.getContentPane()) {
            cmp.setHidden(false);
            cmp.setVisible(true);
        }
        hi.getContentPane().animateLayout(150);
    } else {
        text = text.toLowerCase();
        for(Component cmp : hi.getContentPane()) {
            MultiButton mb = (MultiButton)cmp;
            String line1 = mb.getTextLine1();
            String line2 = mb.getTextLine2();
            boolean show = line1 != null && line1.toLowerCase().indexOf(text) > -1 ||
                    line2 != null && line2.toLowerCase().indexOf(text) > -1;
            mb.setHidden(!show);
            mb.setVisible(show);
        }
        hi.getContentPane().animateLayout(150);
    }
}, 4);

hi.show();