gwt与ArrayList的异步回调<;SomeClass>;检索数据时失败

gwt与ArrayList的异步回调<;SomeClass>;检索数据时失败,gwt,asynchronous,callback,arraylist,rpc,Gwt,Asynchronous,Callback,Arraylist,Rpc,我试图为我的进一步工作制作一个示例代码。我正在使用gwt香兰素和新的gwt。我的目的是填充一些文本框和网格。对于从数据库填充文本框,rpc调用没有问题。但我无法通过使用RPC调用填充datagrid。我曾经 用于填充某些文本框。但当我尝试使用ArrayList用异步回调填充网格时,代码失败了。我知道ArrayList也可以序列化,但我无法解决这个问题。 任何建议都将不胜感激。 这是我的questin的一些代码。 在服务器包中:SqlDbConnection.java public Arr

我试图为我的进一步工作制作一个示例代码。我正在使用gwt香兰素和新的gwt。我的目的是填充一些文本框和网格。对于从数据库填充文本框,rpc调用没有问题。但我无法通过使用RPC调用填充datagrid。我曾经 用于填充某些文本框。但当我尝试使用ArrayList用异步回调填充网格时,代码失败了。我知道ArrayList也可以序列化,但我无法解决这个问题。 任何建议都将不胜感激。 这是我的questin的一些代码。 在服务器包中:SqlDbConnection.java

    public ArrayList<hastaGrid> callGrid(String something){
    ArrayList<hastaGrid> list = new ArrayList<hastaGrid>();
    hastagrid hastaGrid = null;     
    try {
        Statement st = conn.createStatement();
        ResultSet result = st.executeQuery("select name from TEST where name = '"+ something +"'");

        while(result.next()) {
            hastagrid = new hastaGrid(result.getString(1), result.getString(2),result.getNString(2),result.getString(3));
            list.add(hastaGrid);
            System.out.println("result: " +hastagrid.getLogin().toString()+" " + hastagrid.getPassword() +" "+ hastagrid.getName() +" " + hastagrid.getSurname());
        }
        result.close();
        st.close();                 
    } catch (Exception e) {
        e.printStackTrace();
    }       
    return list;
}
在客户端包中:DBConnection.java

public interface DBConnection extends RemoteService {   
public ArrayList<hastaGrid> callGrid(String name);  }
公共接口DBConnection扩展远程服务{
公共ArrayList callGrid(字符串名称);}
在客户端包中:DBConnectionAsync.java

public interface DBConnectionAsync {    
public void callGrid(String name, AsyncCallback<ArrayList<hastaGrid>> callback);   }
公共接口DBConnectionAsync{
public void callGrid(字符串名称,异步回调);}
在客户端包中:userDetail.java

onModuleLoad(){ AsyncCallback>callback=new AuthenticationHandler1(); rpc.gridGetir(“John”,回调); }

私有类AuthenticationHandler实现异步回调{
失效时的公共无效(可丢弃的ex){
RootPanel.get().add(新HTML(“RPC调用失败”);
}
成功时公共无效(ArrayList结果){
result.get(0.getName();}}//我只想在调试时在这里得到一些结果。

我在网上读了很多网页,但找不到具体的解决方案。我可能错了。感谢您的回复。

首先,您应该确保您的RPC返回适当的hastaGrid对象列表,并且请将类名大写:) 我在各种
DataGrid
实现中大量使用了
AsyncDataProvider
模型,并创建了一个类似于以下内容的实现类:

public class MyProvider extends AsyncDataProvider<MyModelObject> implements AsyncCallback<List<MyModelObject>> {
    static int PAGESIZE = 50;
    List<MyModelObject> cache = new ArrayList<MyModelObject>();

    @Override
    protected void onRangeChanged(HasData<MyModelObject> display) {
        final Range range = display.getVisibleRange();          
        int start = range.getStart();
        int end = start + range.getLength();
        if (start >= cache.size() - 1) {
            lastVisible = cache.size() - 1;
            gwtService.fetchRowsFromDbase(this);                
            return;
        }
        List<MyModelObject> dataInRange = cache.isEmpty() ? new ArrayList<MyModelObject>() : cache.subList(start,
                end >= cache.size() ? (cache.size()) : end);
        updateRowData(start, dataInRange);
    }

    public void onFailure(Throwable caught) {
        Window.alert(caught.getMessage());
    }

    public void onSuccess(List<MyModelObject> result) {
        if (result.isEmpty()) {
            //display a warning
            return;
        }
        for (MyModelObject a : result) {
            if (cache.indexOf(a) == -1)
                cache.add(a);
        }
        updateRowData(cache.indexOf(result.get(0)), result);
        updateRowCount(cache.size(), result.size() < PAGESIZE);
        tab.setPageSize(PAGESIZE);
        tab.setPageStart(lastVisible);
        MyModelObject last = cache.get(cache.size() - 1);
        orderOffset = last.getId();         
    }

    public List<MyModelObject> getCache() {
        return cache;
    }
}
如果您还添加了一个寻呼机,这种方法效果最好,因为数据提供程序会侦听范围更改,这些更改是通过单击寻呼机触发的

SimplePager pager = new SimplePager();
pager.setDisplay(yourDataGrid);
//don't forget to add the pager widget to the DOM 

希望这有帮助

首先,您应该确保您的RPC返回适当的hastaGrid对象列表,并且请将类名大写:) 我在各种
DataGrid
实现中大量使用了
AsyncDataProvider
模型,并创建了一个类似于以下内容的实现类:

public class MyProvider extends AsyncDataProvider<MyModelObject> implements AsyncCallback<List<MyModelObject>> {
    static int PAGESIZE = 50;
    List<MyModelObject> cache = new ArrayList<MyModelObject>();

    @Override
    protected void onRangeChanged(HasData<MyModelObject> display) {
        final Range range = display.getVisibleRange();          
        int start = range.getStart();
        int end = start + range.getLength();
        if (start >= cache.size() - 1) {
            lastVisible = cache.size() - 1;
            gwtService.fetchRowsFromDbase(this);                
            return;
        }
        List<MyModelObject> dataInRange = cache.isEmpty() ? new ArrayList<MyModelObject>() : cache.subList(start,
                end >= cache.size() ? (cache.size()) : end);
        updateRowData(start, dataInRange);
    }

    public void onFailure(Throwable caught) {
        Window.alert(caught.getMessage());
    }

    public void onSuccess(List<MyModelObject> result) {
        if (result.isEmpty()) {
            //display a warning
            return;
        }
        for (MyModelObject a : result) {
            if (cache.indexOf(a) == -1)
                cache.add(a);
        }
        updateRowData(cache.indexOf(result.get(0)), result);
        updateRowCount(cache.size(), result.size() < PAGESIZE);
        tab.setPageSize(PAGESIZE);
        tab.setPageStart(lastVisible);
        MyModelObject last = cache.get(cache.size() - 1);
        orderOffset = last.getId();         
    }

    public List<MyModelObject> getCache() {
        return cache;
    }
}
如果您还添加了一个寻呼机,这种方法效果最好,因为数据提供程序会侦听范围更改,这些更改是通过单击寻呼机触发的

SimplePager pager = new SimplePager();
pager.setDisplay(yourDataGrid);
//don't forget to add the pager widget to the DOM 

希望这有帮助

谢谢你的建议。我只是照你说的做了。然后沃利亚。。同时也感谢您提供的代码示例。我将尝试以这种方式实施。至于类名,我同意你的看法:)@Jasper变量orderOffset有什么用?orderOffset是我从类中获取此示例的一个字段,只是为了跟踪最后获取的Id。谢谢你的建议。我只是照你说的做了。然后沃利亚。。同时也感谢您提供的代码示例。我将尝试以这种方式实施。至于类名,我同意你的看法:)@Jasper变量orderOffset有什么用?orderOffset是我从类中得到这个示例的一个字段,只是为了跟踪最后获取的Id。
SimplePager pager = new SimplePager();
pager.setDisplay(yourDataGrid);
//don't forget to add the pager widget to the DOM