Моя проблема в том, что после того, как я выбрал несколько элементов на первой странице, если я разбиваю страницы на другую страницу и возвращаюсь, мои начальные выборы не отображаются. Я попытался реализовать SelectableDataModel
, а также использовать атрибут rowKey
, но проблема не устранена.
Это мой тест bean:
@ManagedBean
@ViewScoped
public class MrBean {
private List<Item> chosenItems;
private LazyDataModel lazyModel;
@PostConstruct
public void prepareTest() {
this.lazyModel = new LazyItemDataModel();
}
public void countItems() {
System.out.println("TEST 3: chosenItems size: " + chosenItems.size());
}
private class LazyItemDataModel extends LazyDataModel<Item> implements SelectableDataModel<Item> {
@Override
public Item getRowData(String rowKey) {
System.out.println("TEST 1: getRowData");
Iterator<Item> iter = ((List<Item>) this.getWrappedData()).iterator();
while (iter.hasNext()) {
Item item = iter.next();
if (item.getId().equals(rowKey)) {
return item;
}
}
return null;
}
@Override
public Object getRowKey(Item item) {
return item.getId();
}
@Override
public List<Item> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map filters) {
System.out.println("TEST 2: load");
// Code to retrieve items from database
}
}
// Getters and Setters
}
Это моя тестовая страница:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui">
<h:head>
<title>Test page</title>
</h:head>
<h:body>
<h:form>
<p:dataTable id="itemTable" var="item" value="#{mrBean.items}" rows="5"
paginator="true" selection="#{mrBean.chosenItems}" lazy="true" >
<p:ajax event="rowSelectCheckbox" listener="mrBean.countItems" />
<p:column selectionMode="multiple" />
<p:column headerText="ID">
<h:outputText value="#{item.id}" />
</p:column>
<p:column headerText="Name">
<h:outputText value="#{item.name}" />
</p:column>
</p:dataTable>
</h:form>
</h:body>
</html>
Я был бы очень признателен, если бы вы могли показать мне, что я сделал неправильно здесь.
ОБНОВЛЕНИЕ: После того, как я добавил больше System.out.println("TEST")
к указанному выше коду, я заметил следующие вещи:
- На консоли каждый раз, когда я разбиваю на страницы,
TEST 1: getRowData
всегда печатается доTEST 2: load
. Как следствие, я считаю, что метод#LazyDataModel.getWrappedData()
может возвращать данные со старой страницы. Сначала я думал, что цель этого метода состоит в том, чтобы извлечь выбранные строки, чтобы выделить их в таблице. Однако, если этот метод вызывается доload
, то он не может сделать это правильно? - После того, как я выбрал 1-й 2 позиции на первой странице, на консоли я увидел
TEST 3: chosenItems size: 2
. Если я разбиваю страницы на 2-ю страницу, а затем возвращаюсь на 1-ю страницу, выбор теряется, как упоминалось. Однако, если я продолжал выбирать другой элемент, на консоли я виделTEST 3: chosenItems size: 3
. Очевидно, что списокchosenItems
по-прежнему сохранил мои старые варианты, но они не отображаются в таблице.