gwtselectionmodel

Select element in CellList using SelectionModel or ListDataProvider


I have used CellList for listing my data using ListDataProvider for managing the data and SelectionModel for selecting an element from CellList and generating events accordingly.

Now when i update or delete element using cellList.getList().set(index, bean) or cellList.getList().remove() it sucessfully do the operation. But after that it automatically selects the first record in CellList which i do not want.

Can anyone suggest how can i deselect the selected record in CellList?

Below is the code how i am initializing the selectionmodel and listprovider:

ListDataProvider<AppsBean> dataProvider = new ListDataProvider<AppsBean>();
CellList<AppsBean> appsCellList;
SingleSelectionModel<AppsBean>  singleSelectionModel;

ProvidesKey<AppsBean> keyProvider = new ProvidesKey<AppsBean>() {
        public Object getKey(AppsBean item) {
            // Always do a null check.
            return (item == null) ? null : item.getId();
        }
    };
    //here cell is the AbstractCell<AppsBean>    
    appsCellList = new CellList<AppsBean> (cell, keyProvider);
    dataProvider.addDataDisplay(appsCellList);
    appsCellList.setKeyboardSelectionPolicy(KeyboardSelectionPolicy.BOUND_TO_SELECTION);

    singleSelectionModel = new SingleSelectionModel<AppsBean>(keyProvider);
    appsCellList.setSelectionModel(singleSelectionModel);
    singleSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {

        @Override
        public void onSelectionChange(SelectionChangeEvent event) {
            AppsBean selectedApp = singleSelectionModel.getSelectedObject();
            if (selectedApp != null)
                appsForm.fillApps(selectedApp);
        }
    });

When i am adding the new record:

dataProvider.getList().add(0, appsBean);

For updating the record:

AppsBean bean = singleSelectionModel.getSelectedObject();
dataProvider.getList().set(dataProvider.getList().indexOf(bean), appsBean);

And for delete:

int selectedIndex = dataProvider.getList().indexOf(singleSelectionModel.getSelectedObject());
dataProvider.getList().remove(selectedIndex);

Solution

  • You will have to implement a KeyProvider in order to make sure that your selected DTO stays the same even when the object itself changes.
    If you don't provide a KeyProvider it will probably use equals to compare the objects and if they change then you might run into problems.

    ProvidesKey keyProvider = new ProvidesKey() {
        public Object getKey(Contact item) {
           //return the unique identifier for your DTO
           return (item == null) ? null : item.id;
        }
    };
    

    Then you have to initialize the CellTable and selectionModel with this keyProvider

     CellList cellList = new CellList(new ContactCell(),keyProvider);
    
     SelectionModel selectionModel = new SingleSelectionModel(keyProvider);
     cellList.setSelectionModel(selectionModel);
    

    Update De-selecting a selected object works like this:

     Object obj  = selectionModel.getSelectedObject();
     if (obj != null) {
         selectionModel.setSelected(obj,false);
     }