Search code examples
jsfprimefacespaginationdatalistselectoneradio

selectOneRadio lost checked value inside a dataList with pagination


I have this example code,

My xhtml page.

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.org/ui"
    xmlns:f="http://java.sun.com/jsf/core">
<h:head>
</h:head>
<h:body>
    <p:dataList value="#{dataListView.lista}" var="l" type="unordered"
        itemType="none" paginator="true" rows="1" styleClass="paginated">
        <f:facet name="header">
                Paginator
            </f:facet>
        <p:selectOneRadio id="resposta" value="#{dataListView.resposta}">
            <f:selectItem itemLabel="Certo" itemValue="Certo" />
            <f:selectItem itemLabel="Errado" itemValue="Errado" />
        </p:selectOneRadio>
    </p:dataList>
</h:body>
</html>

My Bean

package br.com.so.teste;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;
import javax.enterprise.context.SessionScoped;
import javax.faces.view.ViewScoped;
import javax.inject.Named;

import br.com.so.modelo.Questao;

@Named
@ViewScoped
public class DataListView implements Serializable {

    private List<String> lista;
    private String resposta;

    @PostConstruct
    public void init() {
        lista = new ArrayList<>();
        lista.add("1");
        lista.add("2");
        lista.add("3");
        lista.add("4");
        lista.add("5");
    }

    public List<String> getLista() {
        return lista;
    }

    public void setLista(List<String> lista) {
        this.lista = lista;
    }

    public String getResposta() {
        return resposta;
    }

    public void setResposta(String resposta) {
        this.resposta = resposta;
    }

}

The error appear when i change the page view, in pagination have (1,2,3...) if i check the radio button in page '1' and i go to page '2' and i come back to page '1' the radio button is not checked. Why does it happen? How do i fix it? I need to keep the value checked in the radioButtons.


Solution

  • I resolved using this.

    I create 2 SelectoneRadio, one geting the checked value, if exists.. And another only puting the value. I use Ajax to pass the ID. If the map contains the id, i use ajax only to update, because the radio set the value directly in the map.

    <html xmlns="http://www.w3.org/1999/xhtml"
        xmlns:ui="http://java.sun.com/jsf/facelets"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:p="http://primefaces.org/ui"
        xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
    </h:head>
    <h:body>
        <h:form id="formulario">
            <p:dataList value="#{dataListView.lista}" var="l" type="unordered"
                itemType="none" paginator="true" rows="1" styleClass="paginated">
                <f:facet name="header">
                    Paginator
                </f:facet>
                <p:selectOneRadio value="#{dataListView.teste}"
                    rendered="#{dataListView.resposta[l] == null}">
                    <p:ajax listener="#{dataListView.processaResposta(l)}" event="click"
                        update="formulario"></p:ajax>
                    <f:selectItem itemLabel="Certo" itemValue="Certo" />
                    <f:selectItem itemLabel="Errado" itemValue="Errado" />
                </p:selectOneRadio>
    
                <p:selectOneRadio value="#{dataListView.resposta[l]}"
                    rendered="#{dataListView.resposta[l] != null}">
                    <p:ajax event="click" update="formulario"></p:ajax>
                    <f:selectItem itemLabel="Certo" itemValue="Certo" />
                    <f:selectItem itemLabel="Errado" itemValue="Errado" />
                </p:selectOneRadio>
            </p:dataList>
        </h:form>
    </h:body>
    </html>
    

    And in bean...

    import java.io.Serializable;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import javax.annotation.PostConstruct;
    import javax.faces.bean.ManagedBean;
    import javax.faces.bean.SessionScoped;
    
    @ManagedBean
    @SessionScoped
    public class DataListView implements Serializable {
    
        private List<String> lista;
        private Map<String, String> resposta;
        private String teste;
    
        @PostConstruct
        public void init() {
            lista = new ArrayList<>();
            lista.add("1");
            lista.add("2");
            lista.add("3");
            lista.add("4");
            lista.add("5");
            resposta = new HashMap<>();
        }
    
        public List<String> getLista() {
            return lista;
        }
    
        public void setLista(List<String> lista) {
            this.lista = lista;
        }
    
        public Map<String, String> getResposta() {
            return resposta;
        }
    
        public void setResposta(Map<String, String> resposta) {
            this.resposta = resposta;
        }
    
        public void processaResposta(String action) {
            resposta.put(action, teste);
            teste = null;
        }
    
        public String getTeste() {
            return teste;
        }
    
        public void setTeste(String teste) {
            this.teste = teste;
        }
    
    }
    

    After put a answer and ID, you need to make the value 'teste' null.