2

我遇到了 LWUIT 中众所周知的问题。我的带有复选框渲染器的列表组件滚动非常慢。如果要在模拟器上测试我的应用程序,它运行得非常顺利(尽管如此,我看到在滚动操作期间 CPU 使用率高达 60%),但如果在手机上运行它,则焦点移动之间需要几秒钟的时间。

有一个渲染器代码:

public class CheckBoxMultiselectRenderer extends CheckBox implements ListCellRenderer {

public CheckBoxMultiselectRenderer() {
    super("");
}

//override
public void repaint() {
}

public Component getListCellRendererComponent(List list, Object value, 
 int index,boolean isSelected) {
    Location loc = (Location)value;
    setText(loc.getLocationName());
    setFocus(isSelected);
    setSelected(loc.isSelected());

    return this;
}

public Component getListFocusComponent(List list) {
    setText("");
    setFocus(true);
    getStyle().setBgTransparency(Consts.BG_TRANSPARENCY);
    return this;
}
}

这是包含列表的表单的代码:

protected void createMarkup() {
    Form form = getForm();
    form.setLayout(new BorderLayout());
    form.setScrollable(false);

    Label title = new Label("Choose location zone:");
    title.getStyle().setMargin(5, 5, 0, 0);
    title.getStyle().setBgTransparency(Consts.BG_TRANSPARENCY);
    title.setAlignment(Component.CENTER);

    form.addComponent(BorderLayout.NORTH, title);

    list = new List(StateKeeper.getLocationsAsList());
    list.setFixedSelection(List.FIXED_NONE_CYCLIC);
//        list.setSmoothScrolling(true);
    list.getStyle().setBgTransparency(0);
    list.setListCellRenderer(new CheckBoxMultiselectRenderer());
    list.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent ae){
//                List l = (List)ae.getSource();
//                l.requestFocus();
//                l.setHandlesInput(true);
            Location selItem = (Location)list.getSelectedItem();
            selItem.setSelected(!selItem.isSelected());
        }
    });

    form.addComponent(BorderLayout.CENTER, list);
}

我将非常感谢任何帮助!

4

1 回答 1

1

我们必须非常小心地构建 lwuitList。如果我们做错了什么,他们的工作可能会比预期的更糟。我建议你看看这个

LWUIT 博客列表渲染

您还可以重写您的绘画方法。您列表的速度将提高。

于 2012-10-26T10:01:56.083 回答