これまで、いくつかのソースからの入力に基づいてこれを実装しました。ここで私は私のために働いた思いついたものです。
あなたのセルウィジェット内のすべての細胞は(handlesSelectionのためにtrueを返すようにオーバーライドする必要がある)、このように:
/**
* This text cell is designed for use in cell widgets that are tied to Places
* and thus need to have the Activity/Presenter manage the selection to allow
* for a mayStop() rejection of the navigation (user clicks cancel at prompt).
*/
public class PlaceTextCell extends TextCell
{
@Override
public boolean handlesSelection()
{
// So that the selection model won't change the selection automatically.
return true;
}
}
次に、あなたが選択が起こる前に発生CellPreviewEvent(を経由して選択イベントを処理する必要が、SelectionChangeEventとは異なります)。私はDataGridを使用しましたが、これはCellTableでも動作するはずです。
selectionDataGrid.addCellPreviewHandler(new CellPreviewEvent.Handler<Dto>() {
@Override
public void onCellPreview(CellPreviewEvent<Dto> event) {
if(Event.getTypeInt(event.getNativeEvent().getType()) == Event.ONCLICK ||
event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER)
{
eventBus.fireEvent(new MySelectionChangeRequestEvent(event.getValue()));
}
}
});
これは、PlaceController()。goTo()を呼び出す場所変更要求イベントを発生させます。これにより、アクティビティのmayStop()のチェックがトリガーされます。次に、あなたのアクティビティはその相互作用を処理する必要があります。
私の場合は、シングルトンのプレゼンターがいます。そこで私は発表者に新しい場所について話します。この呼び出しによって、対応する行を選択するビューが更新されます。
はまた、私はまだselectionModelのが正常に動作します:この新しい行が選択されているので、後
selectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
public void onSelectionChange(SelectionChangeEvent event) {
eventBus.fireEvent(new MySelectionChangeEvent(selectionModel.getSelectedObject()));
}
});
、別のイベントが新しい選択に基づいてUIの別の部分を更新するために発射されます。
- 「ユーザーがクリックすると実際には選択しない」は、 カスタムセルオーバーライドによって処理されます。
- "場所の変更に影響を与える"部分は、CellPreviewHandlerとPlaceController.goTo(Place)によって処理されます。
- 残りは、アクティビティとプレイスの実装だけで処理されます。
実際のコードを出していないので具体的には示唆しにくいですが、 'CellTable'に付随する' SelectionModel'を拡張して 'setSelected(...)'メソッドをオーバーライドできます特定のフラグがどこかに設定されている場合は、 'super.setSelected(...)'を呼び出すことができます。繰り返しますが、具体的なことがなくても何かを示唆するのは難しいですが、それはあなたが探ることのできる方向です。 – Strelok