Revision history [back]

click to hide/show revision 1
initial version

answered 2012-09-25 14:09:16 +0800

Marky gravatar image Marky flag of Spain

http://www.no/havent-doma...

@pinods, the memory increases while I paging the listbox, when I open a window, close it and then I open again, in summary, always. This is the exemple with 10 beans. the size of the binding list is always 10, accordingly the memory usage may be comparable with 10 objects. This exemple has a paging to emulate the mold="paging". Zul page:

<zk xmlns:n="native">
<borderlayout id = "BLGeneral" onCreate="@command('InicializaPagina')" onTest="@command('test')" apply="org.zkoss.bind.BindComposer" 
viewModel="@id('vm') @init('org.sts.Pruebas.PruebasListBoxDinamico.LBDinamico')">
    <north border="none" id="Norte">
<listbox id="LBSeguimiento" nonselectableTags="" span="3,8"  pagingPosition="bottom" autopaging="true" width="99.8%" sizedByContent="true" style="margin-top:4px;" vflex="true" onSelect="@command('SeleccionaFila')"model="@load(vm.beans2)" selectedItem="@bind(vm.beanSeleccionado)" onPaging="@command('pasarPagina')">
                                    <listhead sizable="true">
                                        <listheader width="33px"> 
                                            <checkbox id="CKTodosSeleccionados" onCheck="@command('SeleccionarTodos', checked = self.checked)"></checkbox>
                                        </listheader>
                                        <listheader ></listheader>
                                        <listheader ></listheader>
                                        <listheader ></listheader>
                                        <listheader ></listheader>
                                        <listheader ></listheader>
                                        <listheader  ></listheader>
                                        <listheader></listheader>
                                        <listheader></listheader>
                                        <listheader ></listheader>
                                        <listheader ></listheader>
                                    </listhead>
                                    <template name="model" var="item">
                                        <listitem  value="@load(item)" onDoubleClick="@command('DubleClick')" >
                                            <listcell style="text-align:center">
                                                <checkbox></checkbox>
                                            </listcell>
                                            <listcell label="@load(item.field1)" ></listcell>
                                            <listcell label="@load(item.field2)" ></listcell>
                                            <listcell label="@load(item.field3)" ></listcell>
                                            <listcell label="@load(item.field4)" ></listcell>
                                            <listcell label="@load(item.field5)"></listcell>
                                            <listcell label="@load(item.field6)"></listcell>
                                            <listcell label="@load(item.field7)"></listcell>
                                            <listcell label="@load(item.field8)"></listcell>
                                            <listcell label="@load(item.field9)"></listcell>
                                            <listcell label="@load(item.field10)"></listcell>
                                        </listitem>
                                    </template>
                                </listbox>
                                <panel  visible="true" height="25px" zclass="z-paging">
                                    <panelchildren style="background:transparent; border:none">
                                        <div style="float:left;">
                                            <toolbarbutton id="TBTPrimeraPos" onClick="@command('Inicio')" style="margin-left:5px;"></toolbarbutton>
                                            <toolbarbutton id="TBTRetroceder" onClick="@command('Retroceder')" style="margin-left:5px"></toolbarbutton>
                                            <separator spacing="5px" orient="vertical"></separator>
                                            <textbox id="TBPagActual" width="50px" value="1" readonly="true"></textbox>
                                            <separator orient="vertical" spacing="1px"></separator>
                                            <label id="LBLTotalPaginas" value=" / 1"></label>
                                            <separator orient="vertical" spacing="5px"></separator>
                                            <toolbarbutton id="TBTAvanzar" onClick="@command('Avanzar')"></toolbarbutton>
                                            <toolbarbutton id="TBTUltimaPos" onClick="@command('Fin')" style="margin-left:5px;"></toolbarbutton>
                                        </div>
                                        <div style="float:right; margin-top:6px; color:gray">
                                            <label id="LBLInfoPaginacion" value="[0 - 0 / 0]" style="float:right"></label>
                                        </div>
                                    </panelchildren>
                                </panel>
</north>
</borderlayout>
</zk>

The java class:

//Comands para enlazar con la capa de visualizacion
        @Command
        @NotifyChange("*")
        public void Avanzar(Event event){
            Avanzar(listaBeansEnlace, listaBeansFiltrada,paginado);
        }

        @Command
        @NotifyChange("*")
        public void Retroceder(Event event){
            Retroceder(listaBeansEnlace, listaBeansFiltrada,paginado);
        }

        @Command
        @NotifyChange("*")
        public void Fin(Event event){
            ultimaPosicion(listaBeansEnlace, listaBeansFiltrada,paginado);
        }

        @Command
        @NotifyChange("*")
        public void Inicio(Event event){
            primeraPosicion(listaBeansEnlace, listaBeansFiltrada,paginado);
        }


//This are the methods that move the records
/**
     * Dada una posicion en la listadBean pasada por parametro,anyade tantos beans como se haya indicado por parametro. Actualiza el paginado con los nuevos valores
     * @param listaBeansEnlace lista donde iran los beans para enlazar con la tabla de datos (el numero maximo de beans debe ser la altura del listbox, se pasa por parametro con numLineasPagina)
     * @param listaBean lista con todos los beans llenos de donde se extrae para llenar la lista de beansEnlace
     */
    public static void Avanzar(List<?>listaBeansEnlace,List<?> listaBean,Paginado paginado){
        //Comprobamos que se pueda avanzar
        if(paginado.getiPosIndiceRegistros()<listaBean.size()){
                //Si vamos a avanzar limpiamos la lista
                listaBeansEnlace.clear();
            int MaxLista = listaBean.size();
            int i = paginado.getiPosIndiceRegistros();
            // Seleccionamos del indice actual (iPosIndiceRegistros) + iPosicionesAvanzar.
            if(MaxLista==0){
                MaxLista++;
                //No hay datos.
                // Actualizamos info de paginaciónZX
                // Nos guardamos el indice actual
                paginado.setiPosIndiceRegistros(0);
                // Actualizamos pagina actual
                paginado.setiPagActual(0);
                paginado.getLBLInfoPaginacion().setValue("[0 - 0 / 0]");
                if(MaxLista<paginado.getNumLineasPagina()){
                    paginado.getLBLTotalPaginas().setValue(" / 1");
                }else{
                    paginado.getLBLTotalPaginas().setValue(" / " + MaxLista / paginado.getNumLineasPagina());
                }
                paginado.getTBPagActual().setValue(String.valueOf(paginado.getiPagActual() + 1));
            }else{
                if (paginado.getiPosIndiceRegistros() < MaxLista-1){
                    //El indice en el que se encuentra el unidynarray es más pequeño que el total de datos
                    //Recorremos los registros desde el actual+1 hasta el actual + el número de lineas por pagina
                    for ( i = paginado.getiPosIndiceRegistros()+1; i < paginado.getiPosIndiceRegistros() + paginado.getNumLineasPagina()+1; i++ ){
                        if (i<=MaxLista){
                            // Validación para que no se pase del total de registros
                            try {
                                CrearFila(i-1,listaBeansEnlace,listaBean);
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }else{
                            //En caso de pasarse paramos el bucle para que la i no se vea afectada
                            //Como se ha pasado de bucle restamos una iteracion a la i
                            break;
                        }
                    }
                    // Actualizamos info de paginación
                    //(se muestran los registros desde el registro actual hasta el registro actual + las lineas que queire visualizar el usuario)
                    paginado.getLBLInfoPaginacion().setValue("[" + (paginado.getiPosIndiceRegistros()+1 ) + " - " + (i-1) + " / " + (listaBean.size()) + "]");
                    if(MaxLista<paginado.getNumLineasPagina()){
                        paginado.getLBLTotalPaginas().setValue(" / 1");
                    }else{
                        //La función ceil redondea hacia arriba
                        paginado.getLBLTotalPaginas().setValue(" / " + (int)Math.ceil( Double.valueOf(MaxLista) / Double.valueOf(paginado.getNumLineasPagina()) ));
                    }
                    paginado.getTBPagActual().setValue(String.valueOf(paginado.getiPagActual() + 1));
                    // Nos guardamos el indice actual(le quitamos dos, uno a razon de la i del bucle, que no ha llegado porque era con < y el otro a razon de que las listas parten desde 0 no desde 1)
                    paginado.setiPosIndiceRegistros(i-1);
                    // Actualizamos pagina actual
                    paginado.setiPagActual(paginado.getiPagActual() + 1);

                }
            }
        }
    }

    /**
     * Muestra los anteriores numLineasPagina registros
     */
    public static void Retroceder(List<?>listaBeansEnlace,List<?> listaBean,Paginado paginado){
        //Capturamos el total de elementos para que no varie cuando se limpie la lista
        int itemsListbox = paginado.getLBSeguimiento().getItemCount();

        // Seleccionamos del indice actual (iPosIndiceRegistros) - iPosicionesAvanzar.
        if (paginado.getiPosIndiceRegistros() - itemsListbox != 0){
            //limpiamos la lista que vamos a asociar
            listaBeansEnlace.clear();
                //Comprobamos si es la ultima pagina
                if(paginado.getiPagActual()!= (int) Math.ceil( Double.valueOf(listaBean.size()+1) / Double.valueOf(paginado.getNumLineasPagina()) )){
                    //No es la ultima pagina
                        //Capturamos la posicion para el retroceso
                    paginado.setiPosIndiceRegistros(paginado.getiPosIndiceRegistros()-paginado.getNumLineasPagina());
                }else{
                    //Es la ultima pagina
                    paginado.setiPosIndiceRegistros(paginado.getiPosIndiceRegistros() - itemsListbox);
                }
                // Actualizamos pagina actual
                paginado.setiPagActual(paginado.getiPagActual() - 1);
                // Actualizamos info
                paginado.getLBLInfoPaginacion().setValue("[" + ((paginado.getiPosIndiceRegistros()+1) - paginado.getNumLineasPagina()) + " - " + (paginado.getiPosIndiceRegistros()) + " / " + (listaBean.size()) + "]");
                //La función ceil redondea hacia arriba
                paginado.getLBLTotalPaginas().setValue(" / " + (int) Math.ceil( Double.valueOf(listaBean.size()+1) / Double.valueOf(paginado.getNumLineasPagina()) ));
                paginado.getTBPagActual().setValue(String.valueOf(paginado.getiPagActual()));
                for (int i = paginado.getiPosIndiceRegistros()-paginado.getNumLineasPagina(); i < paginado.getiPosIndiceRegistros(); i++ ){
                    try {
                        CrearFila(i,listaBeansEnlace,listaBean);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
    }

    public static void ultimaPosicion(List<?>listaBeansEnlace,List<?> listaBean,Paginado paginado){
        int maxTamanyo = listaBean.size() + 1;
        if(maxTamanyo>paginado.getNumLineasPagina()){
                //Miramos que la pagina actual no sea la ultima
                if(paginado.getiPagActual()!=(int) Math.ceil( Double.valueOf(maxTamanyo) / Double.valueOf(paginado.getNumLineasPagina()) )){
                    //Miramos que no acabe exacta la ultima pagina
                    if(maxTamanyo%paginado.getNumLineasPagina()==0){
                        //No sobran lineas por pagina (el número de registros es multiplo de el número de lineas por pagina)
                        paginado.setiPosIndiceRegistros(maxTamanyo -1);
                        paginado.setiPagActual(maxTamanyo / (paginado.getNumLineasPagina()-1));
                    }else{
                        //La última pagina tiene menos registros que el número de lineas (el número de registros no es multiplo del numero de lineas por pagina)
                        paginado.setiPosIndiceRegistros(maxTamanyo-((maxTamanyo-1)%paginado.getNumLineasPagina())-1);
                        paginado.setiPagActual(maxTamanyo / paginado.getNumLineasPagina());
                    }

                    Avanzar(listaBeansEnlace,listaBean,paginado);
                    paginado.getLBSeguimiento().invalidate();
                }
            }
    }

    public static void primeraPosicion(List<?>listaBeansEnlace,List<?> listaBean,Paginado paginado){
        if(paginado.getiPagActual()!=1){
            //No es la primera pagina
            paginado.setiPosIndiceRegistros(0);
            paginado.setiPagActual(0);
            Avanzar(listaBeansEnlace,listaBean,paginado);
            paginado.getLBSeguimiento().invalidate();
        }
    }


//This is the method that pass the bean from the original list to binding list

/**
     * Anyade un bean de una posicion concreta de la lista de beans principal a la lista de beans que esta enlazada a la tabla de datos
     * @param posicion
     * @param listaBeansEnlace
     * @param listaBeans
     * @throws IOException
     */
    @SuppressWarnings("unchecked")
    private static void CrearFila(int posicion, List listaBeansEnlace, List listaBeans) throws IOException{
        listaBeansEnlace.add(listaBeans.get(posicion));
    }

Paginado is an own class for handle the components of own paging(Toolbarbuttons and labels):

public class Paginado extends GenericForwardComposer<Component> {


    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private int iPosIndiceRegistros=0;
    private int iPagActual=0;
    private int numLineasPagina=0;
    private Label LBLInfoPaginacion;
    private Label LBLTotalPaginas;
    private Textbox TBPagActual;
    private Listbox LBSeguimiento;

    /**
     * Constructor de la clase. Permite asignar componentes y variables a las variables miembro de la clase
     * @param LBSeguimiento
     * @param TBPagActual
     * @param LBLTotalPaginas
     * @param LBLInfoPaginacion
     * @param numLineasPagina
     * @param iPagActual
     * @param iPosIndiceRegistros
     */
    public Paginado(Listbox LBSeguimiento, Textbox TBPagActual, Label LBLTotalPaginas,Label LBLInfoPaginacion,int numLineasPagina,int iPagActual, int iPosIndiceRegistros ){
        setLBSeguimiento(LBSeguimiento);
        setTBPagActual(TBPagActual);
        setLBLTotalPaginas(LBLTotalPaginas);
        setLBLInfoPaginacion(LBLInfoPaginacion);
        setNumLineasPagina(numLineasPagina);
        setiPagActual(iPagActual);
        setiPosIndiceRegistros(iPosIndiceRegistros);
    }

    public int getiPosIndiceRegistros() {
        return iPosIndiceRegistros;
    }

    public void setiPosIndiceRegistros(int iPosIndiceRegistros) {
        this.iPosIndiceRegistros = iPosIndiceRegistros;
    }

    public int getiPagActual() {
        return iPagActual;
    }

    public void setiPagActual(int iPagActual) {
        this.iPagActual = iPagActual;
    }

    public int getNumLineasPagina() {
        return numLineasPagina;
    }

    public void setNumLineasPagina(int numLineasPagina) {
        this.numLineasPagina = numLineasPagina;
    }

    public Label getLBLInfoPaginacion() {
        return LBLInfoPaginacion;
    }

    public void setLBLInfoPaginacion(Label lBLInfoPaginacion) {
        LBLInfoPaginacion = lBLInfoPaginacion;
    }

    public Label getLBLTotalPaginas() {
        return LBLTotalPaginas;
    }

    public void setLBLTotalPaginas(Label lBLTotalPaginas) {
        LBLTotalPaginas = lBLTotalPaginas;
    }

    public Textbox getTBPagActual() {
        return TBPagActual;
    }

    public void setTBPagActual(Textbox tBPagActual) {
        TBPagActual = tBPagActual;
    }

    public Listbox getLBSeguimiento() {
        return LBSeguimiento;
    }

    public void setLBSeguimiento(Listbox lBSeguimiento) {
        LBSeguimiento = lBSeguimiento;
    }

    public void reiniciarPaginado(){
        iPosIndiceRegistros = 0;
        iPagActual = 0;
    }

In this exemple I only binding a list with 10 elements. I think that if you change the list and binding again the memory don't should increase, but i can be wrong.

Regards, Marky

Support Options
  • Email Support
  • Training
  • Consulting
  • Outsourcing
Learn More