3

CellListを使用してデータを一覧表示し、ListDataProviderを使用してデータを管理し、SelectionModelを使用してCellListから要素を選択し、それに応じてイベントを生成しました。

これで、cellList.getList()。set(index、bean)またはcellList.getList()。remove()を使用して要素を更新または削除すると、操作が正常に実行されます。しかしその後、それは私が望まないCellListの最初のレコードを自動的に選択します。

CellListで選択したレコードの選択を解除する方法を誰かが提案できますか?

以下は、selectionmodelと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);
        }
    });

新しいレコードを追加するとき:

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

レコードを更新する場合:

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

そして削除のために:

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

3 に答える 3

3

オブジェクト自体が変更された場合でも、選択したDTOが同じままであることを確認するには、KeyProviderを実装する必要があります。
KeyProviderを提供しない場合、オブジェクトを比較するためにequalsを使用する可能性があり、オブジェクトが変更されると、問題が発生する可能性があります。

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

次に、このkeyProviderを使用してCellTableとselectionModelを初期化する必要があります

 CellList cellList = new CellList(new ContactCell(),keyProvider);

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

更新 選択したオブジェクトの選択解除は次のように機能します。

 Object obj  = selectionModel.getSelectedObject();
 if (obj != null) {
     selectionModel.setSelected(obj,false);
 }
于 2011-08-29T07:23:41.523 に答える
2

私はGWT2.5.1でも同じ問題を抱えていました。プログラムでオブジェクトの選択を解除しても機能しませんでした。データプロバイダーのリストからオブジェクトを削除したときに次の行が選択されました(選択を解除すると、別の不要なイベントがスローされました)。解決策は次のことでした。

selectionModel.getSelectedSet().clear();
于 2013-06-17T20:09:06.977 に答える
0

私は同じ問題を抱えていました:@vbjainは書いています:今、私が要素を更新または削除したとき、cellList.getList().set(index, bean)またはcellList.getList().remove()それが正常に操作を実行したとき。しかしその後、それはCellList私が望まない最初のレコードを自動的に選択します。

何時間もグーグルした後、キーボードポリシーが次の場合に発生したことがわかりました。

KeyboardSelectionPolicy.BOUND_TO_SELECTION

を選択しKeyboardSelectionPolicy.DISABLEDた場合、キーボードで上下に一覧表示することはできませんが、最初の行の選択に関する問題は解決されています。

于 2014-05-03T21:16:14.437 に答える