2013-05-06 16 views
2

我有一個GWT應用程序,我需要使用類似但不完全相同的多種數據類型。我想使用由AsyncDataProvider支持的CellList來顯示它們。我試圖避免創建多個CellLists/AsyncDataProviders,所以我試圖以通用的方式做到這一點。但是,我似乎無法弄清楚如何做到這一點。GWT的通用列表AsyncDataProvider

我已經試過:

private AsyncDataProvider<MyInterface> myDataProvider = new AsyncDataProvider<MyInterface>() { 
      @Override 
      protected void onRangeChanged(final HasData<MyInterface> display) { 

       AsyncCallback<Type> callback = new AsyncCallback<Type>() { 
        @Override 
        public void onFailure(Throwable t) { 
         myDataProvider.updateRowData(0, new ArrayList<MyImplementation>());  
        } 
        @Override 
        public void onSuccess(Type result) { 
         //some success logic    
        } 
       }; 
} 

不工作,因爲MyImplementation的收集不能被取代MyInterface的集合。

我也試過:

private AsyncDataProvider<? extends MyInterface> myDataProvider = new AsyncDataProvider<MyInterface>() { 
       @Override 
       protected void onRangeChanged(final HasData<MyInterface> display) { 

        AsyncCallback<Type> callback = new AsyncCallback<Type>() { 
         @Override 
         public void onFailure(Throwable t) { 
          myDataProvider.updateRowData(0, new ArrayList<MyImplementation>());  
         } 
         @Override 
         public void onSuccess(Type result) { 
          //some success logic    
         } 
        }; 
    } 

但我得到的錯誤:"The method updateRowData(int, List<capture#2-of ? extends MyInterface>) in the type AsyncDataProvider<capture#2-of ? extends MyInterface> is not applicable for the arguments (int, ArrayList<MyImplementation>)"

任何想法?是否有可能做我想做的事情。還有其他選擇,例如手動將它們全部轉換爲常見類型,但它似乎是以通用方式處理事件的一個很好的用例。

回答

0

試試這個,創建一個通用的回調,這需要一個數據提供和更新它按你的邏輯

public class HelloCallBack<T> implements AsyncCallback<T> { 

private HelloDataProvider<T> dataProvider; 

@Override 
public void onFailure(final Throwable caught) { 

    dataProvider.updateRowData(0, new ArrayList<T>()); 

} 

@Override 
public void onSuccess(final T result) { 
    // TODO Auto-generated method stub 

} 

public HelloDataProvider<T> getDataProvider() { 
    return dataProvider; 
} 

public void setDataProvider(final HelloDataProvider<T> dataProvider) { 
    this.dataProvider = dataProvider; 
} 

} 

現在創建一個數據提供其

public class HelloDataProvider<T> extends AsyncDataProvider<T> { 

@Override 
protected void onRangeChanged(final HasData<T> display) { 

    final HelloCallBack<T> callBack = new HelloCallBack<T>(); 
    callBack.setDataProvider(this); 

} 

} 

現在在哪裏也是通用永遠不得不使用提供者,用具體類型實例化它。

new HelloDataProvider<YourImplementation>(); 

希望它可以幫助

+0

感謝您的答覆。我希望能夠實現的是使用一個AsyncDataProvider,並根據用戶選擇的選項更改使用哪種回調。據我瞭解,您的解決方案將需要多個數據提供者實現,所以我需要切換當前連接到CellList的哪一個。而且,每個回調都需要一些定製邏輯。 – praetorian1 2013-05-07 07:41:12

+0

它不需要多個數據提供者「實現」,您只需要編寫這兩個類,它只需要多個數據提供者實例(與創建新列表或列表沒有什麼不同)。還要更改每種類型的邏輯,您可以創建多種類型的回調或檢查(結果isInstanceOf YourImplementation)並相應地進行處理。 – skywalker 2013-05-07 08:38:22