Revision history [back]

click to hide/show revision 1
initial version

answered 2012-02-02 10:42:10 +0800

matthewgo gravatar image matthewgo

Hi Coder, I have updated the demo. Please check your customComparator. ZKFiddle-Link

TestComparator.java

package j2nknbfu$v12;


import java.io.Serializable;
import java.util.Comparator;


public class TestComparator implements Comparator, Serializable {
    private boolean asc = true;
    private int type = 0;

    public TestComparator(boolean asc, int type) {
        this.asc = asc;
        this.type = type;
    }

    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }

    public int compare(Object o1, Object o2) {
        MyMail myMail1 = (MyMail) o1;
        MyMail myMail2 = (MyMail) o2;
        switch (type) {
        case 1: // Compare Title
            return myMail1.getSubject().compareTo(myMail2.getSubject()) * (asc ? 1 : -1);
        case 2: // Compare First Name
            return myMail1.getSender().compareTo(myMail2.getSender()) * (asc ? 1 : -1);
        case 3: // Compare Last Name
            return myMail1.getSize().compareTo(myMail2.getSize()) * (asc ? 1 : -1);
        default: // Full Name
            return myMail1.getSubject().compareTo(myMail2.getSubject()) * (asc ? 1 : -1);
        }

    }

}

MyMail.java

package j2nknbfu$v12;



public class MyMail {

  private String subject;

  private String sender;

  private Integer size;

  public MyMail(String subject, String sender, Integer size) {
    this.subject = subject;
    this.sender = sender;
    this.size = size;
  }

  public String getSubject() {
    return subject;
  }

  public void setSubject(String subject) {
    this.subject = subject;
  }

  public String getSender() {
    return sender;
  }

  public void setSender(String sender) {
    this.sender = sender;
  }

  public Integer getSize() {
    return size;
  }

  public void setSize(Integer size) {
    this.size = size;
  }

}

MyRowRenderer.java

package j2nknbfu$v12;

import org.zkoss.zk.ui.*;
import org.zkoss.zk.ui.event.*;
import org.zkoss.zk.ui.util.*;
import org.zkoss.zk.ui.ext.*;
import org.zkoss.zk.au.*;
import org.zkoss.zk.au.out.*;
import org.zkoss.zul.*;


public class MyRowRenderer implements RowRenderer {
    public void render(final Row row, final java.lang.Object data) {
        MyMail mail = (MyMail) data;
        new Label(mail.getSubject()).setParent(row);
        new Label(mail.getSender()).setParent(row);
        new Label(mail.getSize().toString()).setParent(row);
    }
}

TestComposer.java

package j2nknbfu$v12;

import org.zkoss.zk.ui.*;
import org.zkoss.zk.ui.event.*;
import org.zkoss.zk.ui.util.*;
import org.zkoss.zk.ui.ext.*;
import org.zkoss.zk.au.*;
import org.zkoss.zk.au.out.*;
import org.zkoss.zul.*;
import java.util.*;

public class TestComposer extends GenericForwardComposer{

  private Grid inboxGrid;
  public void doAfterCompose(Component comp) throws Exception {
    super.doAfterCompose(comp);

    inboxGrid.setModel(new ListModelList(getData()));

  }

  public void onClick$refreshBtn(Event e){
    inboxGrid.setModel(new ListModelList(getUpdatedData()));
  }

  /* simply return a small model here , you could read data from database for your own implementation.*/
  private List<MyMail> getData(){
    ArrayList<MyMail> list= new ArrayList<MyMail>();

    list.add(new MyMail("Test Mail1","TonyQ", 10));
    list.add(new MyMail("Test Mail12","Ryan", 100));
    list.add(new MyMail("Test Mail13","Simon", 15));
    list.add(new MyMail("Test Mail14","Jimmy", 5));    
    return list;
 }

  private List<MyMail> getUpdatedData(){
    ArrayList<MyMail> list= new ArrayList<MyMail>();

    list.add(new MyMail("Test Mail1-updated","TonyQ", 10));
    list.add(new MyMail("Test Mail12-updated","Ryan", 100));
    list.add(new MyMail("Test Mail13-updated","Simon", 15));
    list.add(new MyMail("Test Mail14-updated","Jimmy", 5));    
    return list;
 }

}

index.zul

<zk>
  <!-- http://www.zkoss.org/forum/listComment/18064-Auto-sort-on-a-grid-doesn-t-update-after-refresh-of-data?lang=en -->
  <zscript><![CDATA[
    Comparator projectAsc = new j2nknbfu$v12.TestComparator(true, 1);
    Comparator projectDsc = new j2nknbfu$v12.TestComparator(false, 1);
    Comparator senderAsc = new j2nknbfu$v12.TestComparator(true, 2);
    Comparator senderDsc = new j2nknbfu$v12.TestComparator(false, 2);
    Comparator sizeAsc = new j2nknbfu$v12.TestComparator(true, 3);
    Comparator sizeDsc = new j2nknbfu$v12.TestComparator(false, 3);


   ]]></zscript>
  <div apply="j2nknbfu$v12.TestComposer"> 
    <grid id="inboxGrid" height="350px" 
        rowRenderer="j2nknbfu$v12.MyRowRenderer"
        emptyMessage="Nothing in Inbox."> 

        <columns>
            <column  label="Subject" sortAscending="${projectAsc}" sortDescending="${projectDsc}" />
            <column width="150px" label="Sender"  sortAscending="${senderAsc}" sortDescending="${senderDsc}" onCreate="self.sort(true)"/>
            <column width="80px" label="Size" sortAscending="${sizeAsc}" sortDescending="${sizeDsc}" />
        </columns>
    </grid>

    <button label="updated data and refresh" id="refreshBtn" />
  </div>
</zk>
Support Options
  • Email Support
  • Training
  • Consulting
  • Outsourcing
Learn More