2011-02-03 4 views
0

私はGWT 2.1とmvp4gを使用してプロジェクトを進めています。ビューでは、私は ListDataProviderでバックアップされたCellListを使用しています。 ListDataProviderをインスタンス化するときに、リスト付きのデータをコンストラクタ に渡すと、CellListはこのデータを表示します。 問題は、ListDataProvider内のリストを変更するたびにCellListが再描画されることはありません( )。私が何をしているのかわかりません 何かが間違っているか、何か不足しています。ListDataProviderでバックアップされたCellListは、リストの変更時に再描画されません。

UiBinderサンプルメッセージxmlファイル:

<g:DockLayoutPanel unit="PX"> 
    <g:west size="300"> 
     <g:VerticalPanel styleName='{style.leftPanel}' spacing="8"> 
      <g:Label>Expositores</g:Label> 
       <g:ScrollPanel addStyleNames='{style.exhibitorList}' width="250px" height="600px"> 
        <c:CellList ui:field="exhibitorList" /> 
       </g:ScrollPanel> 
      <g:Button ui:field="editExhibitorButton" addStyleNames='{style.button}'>Editar</g:Button> 
     </g:VerticalPanel> 
    </g:west> 

    ... 

Viewクラス:

public class ExhibitorsAdminView extends Composite implements 
       ExhibitorsAdminPresenter.IExhibitorsAdminView { 
     interface Binder extends UiBinder<Widget, ExhibitorsAdminView> {} 
     private static final Binder binder = GWT.create(Binder.class); 
     private static class ExhibitorCell extends AbstractCell<Exhibitor> { 
       @Override 
       public void render(Cell.Context context, Exhibitor exhibitor, 
           SafeHtmlBuilder sb) { 
         if (exhibitor != null) { 
           sb.appendEscaped(exhibitor.getName()); 
         } 
       } 
     } 
     private ListDataProvider<Exhibitor> exhibitorsDataProvider; 
     private SingleSelectionModel<Exhibitor> exhibitorsSelectionModel; 
     @UiField(provided = true) 
     CellList<Exhibitor> exhibitorList; 
     @UiField 
     Button editExhibitorButton; 
//  @UiField(provided = true) 
//  CellTable<Object> moduleList = new CellTable<Object>(); 
     public ExhibitorsAdminView() { 
       exhibitorsSelectionModel = new 
SingleSelectionModel<Exhibitor>(Exhibitor.KEY_PROVIDER); 
       exhibitorList = new CellList<Exhibitor>(new ExhibitorCell(), 
Exhibitor.KEY_PROVIDER); 
       exhibitorList.setSelectionModel(exhibitorsSelectionModel); 
       exhibitorsDataProvider = new 
ListDataProvider<Exhibitor>(getExhibitors()); 
       exhibitorsDataProvider.addDataDisplay(exhibitorList); 
       exhibitorList.setPageSize(exhibitorsDataProvider.getList().size()); 
       initWidget(binder.createAndBindUi(this)); 
     } 
     public SingleSelectionModel<Exhibitor> getExhibitorsSelectionModel() 
{ 
       return exhibitorsSelectionModel; 
     } 
     public ListDataProvider<Exhibitor> getExhibitorsDataProvider() { 
       return exhibitorsDataProvider; 
     } 
     private List<Exhibitor> getExhibitors() { 
       List<Exhibitor> exhibitors = new ArrayList<Exhibitor>(); 
       for (int i = 0; i < 10; i++) { 
         exhibitors.add(new Exhibitor(i, "aaaaaaaaaaaaaaa")); 
       } 
       return exhibitors; 
     } 
     public HasClickHandlers getEditExhibitorButton() { 
       return editExhibitorButton; 
     } 
} 

プレゼンタークラス:

@Presenter(view = ExhibitorsAdminView.class) 
public class ExhibitorsAdminPresenter extends 
       BasePresenter<ExhibitorsAdminPresenter.IExhibitorsAdminView, 
ExhibitorsEventBus> { 
     public interface IExhibitorsAdminView { 
       SingleSelectionModel<Exhibitor> getExhibitorsSelectionModel(); 
       ListDataProvider<Exhibitor> getExhibitorsDataProvider(); 
       HasClickHandlers getEditExhibitorButton(); 
     } 
     private DispatchAsync dispatch = null; 
     @Inject 
     public ExhibitorsAdminPresenter(final DispatchAsync dispatch) { 
       this.dispatch = dispatch; 
     } 
     @Override 
     public void bind() { 
       getView().getExhibitorsSelectionModel().addSelectionChangeHandler( 
           new SelectionChangeEvent.Handler() { 
             public void onSelectionChange(SelectionChangeEvent event) { 
               Exhibitor selected = 
getView().getExhibitorsSelectionModel().getSelectedObject(); 
               if (selected != null) { 
                 Window.alert("You selected: " + selected.getName()); 
               } 
             } 
           }); 
       getView().getEditExhibitorButton().addClickHandler( 
           new ClickHandler() { 
             public void onClick(ClickEvent event) { 
             } 
           }); 
     } 
     public void onGoToExhibitorsAdmin() { 
     } 
     public void onLoadExhibitors() { 
       dispatch.execute(new GetExhibitors(), new 
AsyncCallback<GetExhibitorsResult>() { 
         public void onSuccess(GetExhibitorsResult result) { 
           getView().getExhibitorsDataProvider().setList( 
               result.getExhibitors()); 
           getView().getExhibitorsDataProvider().refresh(); 
         } 
         public void onFailure(Throwable caught) { 
           GWT.log("error executing command ", caught); 
         } 
       }); 
     } 
} 

おかげでここ

はコードがあります。

答えて

0

あなたのプロバイダの最初の番号をprovider.getList().add(...)のようにしてリストを操作する必要があります。最小の例については、How to add or remove a single element from/to CellList?を参照してください。

+0

私もこれをテストの対象としており、動作しません。あなたが以前にリンクしている投稿を見ました。 –

0

基本リストとのすべての操作の後にexhibitorsDataProvider.refresh()を呼び出してください。

+0

私はすでに新しいリストを設定した後、onSuccessメソッドでそれを呼び出しています。 –

1

私はそれを解決しました。申し訳ありませんが、mvp4gに関連する問題でした。私は、CellListが配置されたビューの異なるインスタンスに持っていた何かを間違っていた。 ListDataProviderのリストで行っていた更新操作は、表示されていなかったビューインスタンスに対して行われていました。