문제

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);
도움이 되었습니까?

해결책

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);
 }

다른 팁

I was having the same problem with GWT 2.5.1. Deselecting the object programmatically was not working: the next row was selected when I deleted the object from the list of the data provider (and the deselection threw another unwanted event). The solution was to do:

selectionModel.getSelectedSet().clear();

I had the same issue: @vbjain wrote: 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.

After hours of googling I found, that it happend when keyboard policy is:

KeyboardSelectionPolicy.BOUND_TO_SELECTION

If you select KeyboardSelectionPolicy.DISABLED, you can not list up/down by keyboard, but the issue with selection of first row is resolved.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top