2011-02-03 37 views
0

我正在使用GWT 2.1和mvp4g開發項目。在一個視圖中,我使用了一個由ListDataProvider支持的CellList 。如果在實例化ListDataProvider時將帶有數據的List傳遞給構造函數 ,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

只需在底層列表的所有操作之後調用exhibitorsDataProvider.refresh()

+0

設置新列表後,我已經在onSuccess方法中調用它。 – 2011-02-07 08:46:58

1

我解決了它。對不起,這是一個與mvp4g有關的問題。我做了一些錯誤,導致CellList被放置在視圖的不同實例上。我在ListDataProvider列表上執行的更新操作是在未顯示的視圖實例上完成的。

相關問題