- 
    Type:Bug 
- 
    Resolution: Fixed
- 
    Priority:Normal 
- 
    Affects Version/s: 6.5.2
- 
    Component/s: Components
- 
    None
- 
        None
When sorting a list model that is bound to a Listbox component that does not have a Listhead child, Listbox.onListDataChange(...) throws a NullPointerException.
Consider this simple view model:
package org.zkoss.testing;
    import java.util.ArrayList;
    import java.util.Comparator;
    import org.zkoss.bind.annotation.Command;
    import org.zkoss.bind.annotation.Init;
    import org.zkoss.zkplus.databind.BindingListModelList;
    import org.zkoss.zul.ListModelList;
public class SimpleViewModel {
        private static final Comparator<String> COMPARATOR = new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) 
};
private ListModelList<String> listModel;
        @Init
        public void init() 
public ListModelList<String> getListModel()
{ return listModel; }public void setListModel(ListModelList<String> listModel)
{ this.listModel = listModel; }        @Command
        public void sortList() 
}
Bound to this ZUL:
<vbox apply="org.zkoss.bind.BindComposer" viewModel="@id('vm') @init('org.zkoss.testing.SimpleViewModel')">
<button label="Sort Values" onClick="@command('sortList')"/>
        <listbox id="listbox" model="@bind(vm.listModel)">
            <template name="listboxModel">
                <listitem><listcell value="@bind(each)"/></listitem>
            </template>
        </listbox>
</vbox>
When the sortList() command is executed, the listbox throws a NullPointerException:
    Apr 8, 2013 2:27:35 PM org.zkoss.bind.impl.BinderImpl$CommandEventListener onEvent:1327
    SEVERE: null
    java.lang.NullPointerException
        at org.zkoss.zul.Listbox.onListDataChange(Listbox.java:2553)
        at org.zkoss.zul.Listbox.access$800(Listbox.java:261)
        at org.zkoss.zul.Listbox$4.onChange(Listbox.java:461)
        at org.zkoss.zul.AbstractListModel.fireEvent(AbstractListModel.java:59)
        at org.zkoss.zul.ListModelList.sort(ListModelList.java:417)
        at org.zkoss.testing.SimpleViewModel.sortList(SimpleViewModel.java:40)
        ...
    [ Stack trace truncated ]
The fix seems as easy as just adding a null-pointer check to the enclosing conditional in Listbox.onListDataChange at line 2550:
    if (event.getType() == ListDataEvent.STRUCTURE_CHANGED
        && _model instanceof Sortable) {
Changes to:
    if (event.getType() == ListDataEvent.STRUCTURE_CHANGED
        && _model instanceof Sortable
        && _listhead != null) {
A workaround is to add the Listhead component with visibility set to false.