First of all, a listbox with 8000 typically is unlikely to be user
friendly, perhaps you should be using a SuggestBox instead?

However, if you really do want a listbox, you're on the right track in
that using HTML is the only way to get reasonable performance with a
large number of elements in IE.
The reason your second example is still slow is because of all the
string concatenation overhead - you should be using a stringbuilder
here.
I put together a quick test using StringBuilder:

        StringBuilder htmlSelect = new StringBuilder();
        htmlSelect.append("<select>");
        for (int i = 0; i < 8000; i++) {
            htmlSelect.append("<option>").append(i).append("</option>");
        }
        htmlSelect.append("</select>");

        HTML html = new HTML(htmlSelect.toString());
        RootPanel.get().add(html);

On my eee netbook running IE6:
- your first example, using ListBox directly takes 70 seconds for the
8000 elements
- your second example, using HTML but with +=, takes 24 seconds for
8000 elements
- my example, using HTML with StringBuilder, takes 0.6 seconds

Unfortunately, by using HTML instead of ListBox, you lose all the nice
methods available in ListBox.
I don't think ListBox.wrap() will work if you are creating the listbox
this way, but if you use a HtmlPanel and get the native Select
element, I believe you can do something like this:

    public class MyListBox extends Composite {
        private final SelectElement _select;

        public MyListBox() {
            String id = HTMLPanel.createUniqueId();
            StringBuilder htmlSelect = new StringBuilder();
            htmlSelect.append("<select id='").append(id).append("'>");
            for (int i = 0; i < 8000; i++) {
                htmlSelect.append("<option>").append(i).append("</option>");
            }
            htmlSelect.append("</select>");

            HTMLPanel htmlPanel = new HTMLPanel(htmlSelect.toString());
            _select = SelectElement.as(htmlPanel.getElementById(id));
            initWidget(htmlPanel);
        }

        public String getValue(int index) {
            return _select.getOptions().getItem(index).getValue();
        }

        public int getSelectedIndex() {
            return _select.getSelectedIndex();
        }

        //etc...
    }

Anyone know of any downfalls to this approach?

On Jul 30, 8:59 am, Enea <eneager...@gmail.com> wrote:
> Hi.
>
> I'm populating  ListBoxwith 8000 items.
>
> ListBoxlb=newListBox();
> for(int i=0;i<8000;i++)
> lb1.addItem(""+i);
>
> RootPanel.get().add(lb1);
>
> In my real project I have to add items from a big list of cities, but
> anyway.
> That takes 5 seconds on my developer machine, in hosted mode.
> In IE is a wasting 15-20 seconds :(
>
> Trying making some test, it result that with Safari is working very
> good...slower than a second.
> I have to develop for IE...unfortunately.
>
> So, i've tried that:
>
> String HtmlSelect="<select>";
> for(int i=0;i<8000;i++)
> HtmlSelect+="<option>"+i+"</option>";
>
> HtmlSelect+="</select>";
> HTML html=new HTML(HtmlSelect);
> RootPanel.get().add(html);
>
> But that give me slower result...
>
> this is the same issue 
> ofhttp://code.google.com/p/google-web-toolkit/issues/detail?id=49
>
> any faster solution?
>
> Thanks in advance!
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Google Web Toolkit" group.
To post to this group, send email to Google-Web-Toolkit@googlegroups.com
To unsubscribe from this group, send email to 
google-web-toolkit+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/Google-Web-Toolkit?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to