问题
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);
回答1:
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);
}
回答2:
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();
回答3:
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.
来源:https://stackoverflow.com/questions/7219572/select-element-in-celllist-using-selectionmodel-or-listdataprovider