2015-04-21 3 views
2

Я не могу удалить элемент из массива. То, что я пробовал, вставлено ниже. Невозможно понять, что не так в нижнем коде. являетсяНе удается удалить объект из архаиста

XHTML
<p:dataTable id="emaildt" styleClass="hide-column-names" 
    style="width:70%" rowIndexVar="rowIndex" 
    value="#{myBean.emailAddressList}" var="email"> 
    <p:column style="width:15%"> 
     <p:inputText id="email" value="#{email.email}" 
     validatorMessage="Invalid email" onblur="TrimString(this)"> 
      <f:validateRegex 
      pattern="^(([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.+)|([A-Za-z0-9]+\++))*[A-Za-z0-9][email protected]((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6}$" /> 
      <p:ajax event="blur" 
       global="false" listener="#{myBean.checkEmailExist(email)}" /> 
     </p:inputText> 
    </p:column> 
    <p:column style="width:13%"> 
     <p:spacer width="10" rendered="#{myBean.emailAddressList.size()>'1'}"/> 
     <p:commandLink id="delete" immediate="true" 
      actionListener="#{myBean.removeEmailFromList}" 
      update="emaildt" process="emaildt" 
      rendered="#{myBean.emailAddressList.size()>'1' &amp;&amp; false}"> 
       <h:graphicImage value="../images/button_remove.gif" /> 
       <f:param name="rowToRemove" value="#{rowIndex}" /> 
     </p:commandLink> 

     <p:spacer width="5" rendered="#{rowIndex == myBean.emailAddressList.size()-1}"/> 

     <p:commandLink id="addemailbtn" immediate="true" 
      actionListener="#{myBean.addEmail}" 
      style="float:right;" update="emaildt" process="@this emaildt" 
      rendered="#{rowIndex == myBean.emailAddressList.size()-1}"> 

      <h:graphicImage value="../images/addbutton.jpg" /> 
     </p:commandLink> 
    </p:column> 
</p:dataTable> 

Создать модель класса EmailAddressModel с струнной электронной почты и его добытчиками и сеттеров.

MyBean код

List<emailAddressList> emailAddressList; //make its getters and setters 
@PostConstruct 
public void fillPage() { 

    emailAddressList = new ArrayList<EmailAddressModel>(); 
    emailAddressList.add(new EmailAddressModel()); 

} 

public void addEmail() { 
    try 
    { 

     EmailAddressModel emailAddress = new EmailAddressModel(); 
     emailAddressList.add(emailAddress); 
    } 
    catch(IndexOutOfBoundsException I) { 
     log.warn("FL Warning", I); 

    } 
} 

public void removeEmailFromList() { 
    String rowIndex = null; 
    try { 
     rowIndex = FacesContext.getCurrentInstance().getExternalContext() 
       .getRequestParameterMap().get("rowToRemove"); 
     int index = Integer.parseInt(rowIndex); 
     emailAddressList.remove(index); 

    } catch (Exception e) { 
     log.warn("FL Warning", e); 
    } 
} 

Проблема есть -> после того, как мы добавим и ввести значения в первом и втором удалить, нажмите на удаление из первой строки, то вторая строка будет удален. При отладке первая строка удаляется в backend arraylist, но в конце, вторая строка удаляется.

Надеюсь, что приведенная выше информация полезна.

+0

Массивы в Java нулевые индексируются. Это звучит как ваша проблема. –

+0

@BoristheSpider: код использует arraylist. как объясняется в вопросе, когда я нажимаю на удаление первой строки, индекс строки, полученный в конце, сам равен нулю, т. е. удаляет объект с нулевым индексом. и удаляет правильную строку из arraylist. –

+0

какая строка удалена в бэкэнд и интерфейсе, если вы нажмете 4-ю строку? – Kukeltje

ответ

0

Получил раствор добавлен atrribute resetValues ​​= "true" to p: commandLink. Спасибо всем, кто мне помог .. :)

+0

??? Это не то, что я должен делать ... У вас, скорее всего, есть другая оригинальная проблема. Ошибки проверки или что-то в этом роде. Я немного поглядел, и что, если вы удалите «process =» emaildt «» из кнопки удаления? И, возможно, измените его на «process =» @ this »(я всегда забываю по умолчанию кнопки pf) – Kukeltje

+0

Я не хочу изменять значение атрибута процесса. когда нажата кнопка «Удалить», я хочу обработать весь тип данных, чтобы значение было получено в бэк-файле. Эта проблема все еще существует, если значение процесса изменяется на @this .. –

0

Проверьте значение переданного rowIndex, как упомянуто Борисом Пауком, Java индексируется нулем.

Вполне вероятно, что вы возвращающая RowIndex в 1, когда первый элемент индексируется на 0.

Чтобы проверить, в вашем примерке поймать блок, который вы можете использовать:

int index = Integer.parseInt(rowIndex) - 1; 
+0

Я использовал этот метод, но на этот раз ни одна строка не удаляется. индекс, полученный в задней части, является правильным. –