Флажки ADF в таблице, отсутсвие выбранной строки отсутствует - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть таблица, в которой первый столбец должен быть флажком, чтобы вы могли выбрать группу строк, а пока просто добавьте ее в список, хранящийся в области потока страниц.Проблема в том, что щелчок по флажкам иногда приводит к отставанию выбранной строки и добавлению неправильной строки.Ex.Я нажимаю флажок в первой строке, затем, пока он обрабатывается, я снимаю флажок, затем нажимаю другой флажок, он будет добавлять первую строку еще, потому что думает, что выбранная строка все еще является первой строкой.

Таблица:

 <af:table value="#{bindings.documents.collectionModel}" var="row" rows="#{bindings.documents.rangeSize}"
                  emptyText="#{bindings.documents.viewable ? 'No data to display.' : 'Access Denied.'}"
                  rowBandingInterval="0" selectedRowKeys="#{bindings.documents.collectionModel.selectedRow}"
                  selectionListener="#{bindings.documents.collectionModel.makeCurrent}" rowSelection="single"
                  fetchSize="#{bindings.documents.rangeSize}" filterModel="#{bindings.documentsQuery.queryDescriptor}"
                  filterVisible="true" queryListener="#{bindings.documentsQuery.processQuery}" varStatus="vs" id="t1"
                  autoHeightRows="0" styleClass="AFStretchWidth" scrollPolicy="page">
            <af:column id="c41" align="center" width="50">
                <?audit suppress oracle.adf.faces.tablecolneedsheaders?>
                <af:selectBooleanCheckbox id="sbc1" valueChangeListener="#{CopyQueueBean.toggleCheckbox}"
                                          autoSubmit="true">
                    <?audit suppress oracle.adf.faces.compnotlabelled?>
                </af:selectBooleanCheckbox>
            </af:column>

            <af:column sortProperty="#{bindings.documents.hints.id.name}" filterable="true" sortable="true"
                       headerText="#{labels.ID}" id="c1" align="center">
                <af:outputText value="#{row.id}" shortDesc="#{bindings.documents.hints.id.tooltip}" id="ot1"/>
            </af:column>
            <af:column sortProperty="#{bindings.documents.hints.fileName.name}" filterable="true" sortable="true"
                       headerText="#{labels.TITLE}" id="c4" align="center" width="400">
                <af:panelGroupLayout id="pgl2" styleClass="AFStretchWidth" inlineStyle="float:left; text-align:left;">
                        <af:spacer width="20px" id="leftIconSpacer" />
                        <af:image source="#{row.icon}" id="i6"
                                  inlineStyle="width:40.0px;"/>
                        <af:spacer width="40px" id="iconSpacer" />
                        <af:outputText value="#{row.fileName}" id="fot2"/>
                    </af:panelGroupLayout>
            </af:column>

Метод My Bean:

public void toggleCheckbox(ValueChangeEvent valueChangeEvent) {
    // Add event code here...
    Boolean checked = (Boolean) valueChangeEvent.getNewValue();
    //get list
    ADFContext adfCtx = ADFContext.getCurrent();
    Map params = adfCtx.getPageFlowScope();
    List<Row> list = (List<Row>) params.get("docQueue");
    if (list == null) {
        list = new ArrayList<CopyQueuePojo>();
    }

    DCBindingContainer bindings = (DCBindingContainer) BindingContext.getCurrent().getCurrentBindingsEntry();
    DCIteratorBinding documents = bindings.findIteratorBinding("documentsIterator");
    int index = documents.getCurrentRowIndexInRange();

    Row[] rows = documents.getAllRowsInRange();
    Row line = rows[index];

    if (checked) {
        //add to queue
        if (index >=  0) {                
            //check to make sure there are no duplicates
            boolean exists = false;
            for(int i=0; i<list.size(); i++) {
                if(list.get(i).getId() == ((String) line.getAttribute("id"))) {
                    exists = true; 
                    break;
                }
            }
            if (!exists) {                    
                list.add(line);
            }
        }
    } else {
        //remove from queue
        for(int i=0; i<list.size(); i++) {
            if(list.get(i).getId() == ((String) line.getAttribute("id"))) {
                list.remove(i);
            }
        }
    }
    params.put("docQueue", list);
}

JDEVELOPER: 12.2.1.2.0

Должен ли я использовать другой способ установки выбранной строки?или я не должен использовать valuechangelistener?или это что-то еще?

1 Ответ

0 голосов
/ 13 декабря 2018

Лучший способ добавить selectBooleanCheckbox в таблицу на основе ViewObject - это добавить логическое переходное значение в ваш viewObject.Это позволит вам сохранить разные логические значения для каждой строки и легко получить к ним доступ так же, как и к другим значениям столбца.

Для этого:

1) ДобавитьisSelected логический переходный атрибут вашего ViewObject:

<ViewAttribute
Name="isSelected"
IsSelected="false"
IsPersistent="false"
PrecisionRule="true"
Type="java.lang.Boolean"
ColumnType="NUMBER"
AliasName="VIEW_ATTR"
SQLType="BIT"
Passivate="true">
<DesignTime>
  <Attr Name="_diagramName" Value=" "/>
</DesignTime>
<Properties>
  <SchemaBasedProperties>
    <CONTROLTYPE
      Value="check_box"/>
    <DISPLAYWIDTH
      Value="10"/>
    <DISPLAYHEIGHT
      Value="10"/>
  </SchemaBasedProperties>
</Properties>

2) Перетащите ваш ViewObject в виде таблицы в ваше представление, вы должны добавить следующий столбец:

<af:column sortable="false" id="c1" width="20">
    <af:selectBooleanCheckbox value="#{row.bindings.isSelected.inputValue}" label="#{row.bindings.isSelected.label}" id="sbc1"/>
</af:column>

3) В ваших действиях Bean легко получить логическое значение:

    Boolean val = (Boolean )JSFUtils.resolveExpression("#{row.bindings.isSelected.inputValue}");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...