如何在wicket中创建可排序的数据视图

时间:2012-09-11 10:26:49

标签: java wicket

我按照这个例子:http://www.wicket-library.com/wicket-examples/repeater/wicket/bookmarkable/org.apache.wicket.examples.repeater.SortingPage?0

这是我的代码:

    SortablePlayerDataProvider dp = new SortablePlayerDataProvider();
    final DataView<Player> dataView = new DataView<Player>("rows", dp, 10) {

        private static final long serialVersionUID = 1L;

        @Override
        protected void populateItem(final Item<Player> listItem) {
            final Player player = listItem.getModelObject();
            listItem.setModel(new CompoundPropertyModel<Player>(player));
            listItem.add(new Label("name", player.getName()));
            listItem.add(new Label("surname", player.getSurname()));
            listItem.add(new Label("club", player.getClub()));
        }
    };

和提供者:

public class SortablePlayerDataProvider extends SortableDataProvider<Player> {

    private static final long serialVersionUID = 1L;

    public SortablePlayerDataProvider() {
        setSort("surname", SortOrder.ASCENDING);
    }

    @Override
    public Iterator<Player> iterator(int first, int count) {
        return tournamentService.getAllPlayer().subList(first, first + count).iterator();
    }

    @Override
    public int size() {
        return tournamentService.getAllPlayer().size();
    }

    @Override
    public IModel<Player> model(final Player object) {
        return new LoadableDetachableModel<Player>() {

            private static final long serialVersionUID = 1L;

            @Override
            protected Player load() {
                return object;
            }
        };
    }
}

但排序不起作用,我不知道为什么。怎么了 ?是否有人选择如何调试它?

更新:

有人可以解释我并显示这个dataProvider在哪里排序项目吗?

因为当我打印它时:

    Iterator<Player> a = dp.iterator(0, dp.size());
    for (Iterator<Player> iterator = a; iterator.hasNext();) {
        System.out.println(iterator.next());
    }

项仍然没有排序,当我寻找这个提供程序的实现时,我无法找到这个迭代器的排序。

2 个答案:

答案 0 :(得分:0)

我已经看到上面例子的代码了。也许你可能需要使用组件OrderByBorder

更新

数据排序应该由您的数据源执行,SortableDataProvider不会自己执行。如果查看示例代码,可以看到它使用ContactsDatabase作为数据源。该类保留两个排序列表,一个用于“名称”,另一个用于“姓氏”属性。

答案 1 :(得分:0)

好的,我发现它为什么不起作用。在wicket示例中,项目在您定义迭代器时进行排序:

     return getContactsDB().find(first, count, getSort()).iterator();

但我不明白为什么我需要对项目进行排序。然后,当我创建迭代器时,我可以创建一个简单的新IDataProvider排序项,它也是排序的。这堂课真的很模糊......