Hey I have a ListView nested inside a ListView and want to change the inner ListViews visibility on click of an AjaxLink.
I saw a lot of posts about it and took some advice from it. E.g. : .setMarkupId(true), add a WebMarkupContainer, ...
But nothing really helped. Anyway, here's what I got so far.
public class EditZustaendigkeit extends WebPage {
private static final long serialVersionUID = 1L;
private List<Institut> institute = new ArrayList<Institut>();
private Form<Void> mainForm = new Form<Void>("mainForm");
public EditZustaendigkeit() {
this.add(mainForm);
createInstitute();
mainForm.add(new ListView<Institut>("listView", getInstitute()) {
private static final long serialVersionUID = 1L;
protected void populateItem(final ListItem<Institut> item) {
final int index = item.getIndex();
AjaxLink<String> myLink;
IModel<String> labelModel = Model.of("+");
final Institut institut = (Institut) institute.get(index);
item.add(new Label("institutLabel", new PropertyModel<Institut>(institut, "langName")));
final WebMarkupContainer div = new WebMarkupContainer("cont");
div.setOutputMarkupId(true);
div.setOutputMarkupPlaceholderTag(true);
div.add(new ListItemZustaendigkeit("zustaendigkeiten", item, institut));
item.add(div);
item.add(myLink = new AjaxLink<String>("extenderInstitut") {
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
collapseItem(index, item, div);
target.add(mainForm);
item.add(div);
setResponsePage(getPage());
}
});
myLink.setBody(labelModel);
myLink.setOutputMarkupId(true);
item.add(new CheckBox("institutCheck", Model.of(Boolean.FALSE)) {
private static final long serialVersionUID = 1L;
// todo
});
}
});
}
public void expandAllItem(ListView<Institut> listView) {
}
public void collapseAllItem(ListView<Institut> listView) {
}
public void expandItem(int index, ListItem<Institut> item, WebMarkupContainer div) {
div.setVisible(true);
}
public void collapseItem(int index, ListItem<Institut> item, WebMarkupContainer div) {
div.setVisible(false);
}
ListItemZustaendigkeit extends from Panel. It has it's corresponding .html file.
Right now I want to focus on public void collapseItem()
because I guess if one can be solved all the others should be possible as well.
The problem appears to be in your onClick
of "extenderInstitut". You are calling setResponsePage
which will cause your repeater to initialize again. Also, you want to have setOutputMarkupId(true)
on mainForm
.
item.add(myLink = new AjaxLink<String>("extenderInstitut") {
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
collapseItem(index, item, div);
target.add(mainForm);
}
});