Search code examples
javagxt

Unable to refresh GXT ListField


OVERVIEW:

Im using a dynamic GXT ListField to list all approvers at a location from the DB and preselect the selected ones(isSelected==true).

PROBLEM:

It looks like the store has the right data and selects the correct ordinal in the list but the data in the visible ListField is still showing the data from the very first time the ListField was loaded. I'm unable to refresh the List UI to show the items from the second location.

EXAMPLE:

Location1:

All approvers={a,b,c,d,e,f,g,h,i,j}

selected approvers = {a,b,c}

display={[a],[b],[c],d,e,f,g,h,i,j} where [] = selected

Location2:

All approvers={x,y,z,l,m,n,o,p,q,r}

selected approvers = {x,y,z,l}

display={[a],[b],[c],[d],e,f,g,h,i,j} where [] = selected (error!)

expected = {[x],[y],[z],[l],m,n,o,p,q,r}

note: it has selected 4 now, meaning its using the correct store,display still shows location1 data though :(

CODE:

ListField<Approver>() approversListField ;

    OnModuleload() //..not including for simplicity
    {
    :

    panel.add(getInitialApproverList());
    loadApprovers(1);
    loadApprovers(2);
    }

        private Widget getInitialApproverList() {

            approversListField = new ListField<Approver>();
            approversListField.setEmptyText("employee last name");
            approversListField.setTemplate(getApproverTemplate());
            approversListField.setFieldLabel("Approvers *");
            approversListField.setId("approvers");
            approversListField.setEmptyText("No approvers available.");

                return approversListField;

        }

        private void loadApprovers(int locationID) {

                ListStore<Approver> approversStore = dataStores.getApprovers(locationID);           
                approversListField.setStore(approversStore);
                approversListField.setValueField("userID");
                approversStore.addStoreListener(new StoreListener<Approver>() {
                    @Override
                    public void storeDataChanged(StoreEvent<Approver> se) {
                        super.storeDataChanged(se);

                        approversListField.fireEvent(Events.Render);

                    }
                });

                /**
                 * // * Attach render listener, had to do it on render because select()
                 * // * method only works onrender // *
                 * http://www.sencha.com/forum/showthread.php?55659-Selecting-Items-in-ListField-After-Load // *
                 */
                approversListField.addListener(Events.Render, new Listener<BaseEvent>() {
                    @Override
                    public void handleEvent(BaseEvent be) {

                        ListViewSelectionModel<Approver> approverListFieldSelectionModel = approversListField.getListView()
                                .getSelectionModel();


                        approversListField.getListView().refresh();
                        approverListFieldSelectionModel.deselectAll();                                      

                        System.out.println("approversStore size:"+approversListField.getStore().getCount());
                        for (int i = 0; i < approversListField.getStore().getCount(); i++) {
                            Approver app = approversListField.getStore().getAt(i);

                            System.out.println(app);                    
                            if (app.isSelected() == true) {

                                System.out.println("FOUND THE APPROVER!  " + i);
                                approverListFieldSelectionModel.select(app, true);                                                                              

                            }
                        }

                    }
                });

        }

Solution

  • Finally found it myself. Leaving it here for what it's worth.

    Looks like if the store changes, you have to reset the store for the Listfield's View 's store too.

    approversListField.getListView().setStore(approversListField.getStore());
    

    No need of firing Render.Can do it all on store data changed.

    approversStore.addStoreListener(new StoreListener<Approver>() {
                @Override
                public void storeDataChanged(StoreEvent<Approver> se) {
                    super.storeDataChanged(se);
    
                    ListViewSelectionModel<Approver> approverListFieldSelectionModel = approversListField.getListView()
                            .getSelectionModel();
                    approverListFieldSelectionModel.deselectAll();
                    approversListField.getListView().setStore(approversListField.getStore());
                    approversListField.getListView().refresh();
                    for (int i = 0; i < approversListField.getStore().getCount(); i++) {                    
                        Approver app = approversListField.getStore().getAt(i);
                        if (app.getIsselected() == true) {                  
                            approverListFieldSelectionModel.select(i, true);
    
                        }
                    }
    
                }
            });