Maybe do not use an anonymous class but rather one that you can "update"
with the search criteria (you could do it with an anonymous class and the
"updates" are done in fields of the outer class, but a non-anonymous class
for the provider pour give better encapsulation and would better follow the
"single responsibility principle"):
- When the table asks for data, the AsyncDataProvider uses the search
criteria it last received
- When search criteria change, the AsyncDataProvider is updated and then
a refresh is triggered to update the view with the new data (possibly by
triggering the AsyncDataProvider)
BTW I'd do the same for the ColumnSortList: listen to the event and update
the provider with the ColumnSortList before you trigger an update.
On Friday, July 19, 2013 10:46:58 AM UTC+2, Jochen Schnaidt wrote:
>
> Hi everybody,
> I have a short but painful question: Where is the right place to
> initialize my AsyncDataProvider?
>
> Story so far:
> In my Controller class I have my AsyncDataProvider as reference and the
> search method where I built the asynchronous callback and process my data,
> looks like this.
>
> private final ClientServiceAsync service = GWT.create(ClientService.class);
> private AsyncDataProvider<Model> provider;
> private List<Model> dataList = new ArrayList<Model>();
>
> // other stuff here...
>
> void search(final TO_Search pSearchCriteria) {
>
> // Associate an async data provider to the table
> provider = new AsyncDataProvider<Model>() {
>
> @Override
> protected void onRangeChanged(HasData<Model> display) {
> final int start = display.getVisibleRange().getStart();
> int length = display.getVisibleRange().getLength();
>
> // Get the ColumnSortInfo from the table.
> final ColumnSortList sortList =
> view.cellTable.getColumnSortList();
> final ColumnSortInfo sortInfo = sortList.get(0);
> final String dataStoreName =
> sortInfo.getColumn().getDataStoreName();
> final boolean isAscending = sortInfo.isAscending();
>
> AsyncCallback<TO_Result> callback = new
> AsyncCallback<TO_Result>() {
> @Override
> public void onFailure(Throwable caught) {
> Window.alert(caught.getMessage());
> }
>
> @Override
> public void onSuccess(TO_Result data) {
>
> if (!GWT.isProdMode()) {
> GWT.log(this.getClass() + ": Remote Procedure Call -
> Success");
> GWT.log(this.getClass() + ": No. of results = " +
> data.getCount());
> }
>
> if (data.getCount() != 0) {
>
> dataList.addAll(data.getResults());
>
> updateRowData(start, data.getResults());
> updateRowCount(data.getCount(), true);
>
> if (data.isGoToFirstPage()) {
> view.setPagerFirstPage();
> }
>
> } else {
>
> dataList.clear();
> updateRowData(start, dataList);
> updateRowCount(data.getCount(), true);
>
> view.simplePopup.setWidget(new
> HTML(CONSTANTS.noSearchResults()));
> }
> }
> };
> service.search(searchCriteria, start, length, dataStoreName,
> isAscending, callback);
> }
> };
> } // end search()
>
>
> This solution works very well, most of time. Sometimes it shows a very
> strange behavior and comes up with old search results. And it looks
> absolutely wrong for me that the AsyncDataProvider is always new created
> for every search.
> Until now I have no other idea, how I could do this, because in the end,
> I need to call my service, which is defined in the AsyncDataProvider.
>
> Is this the right design?
>
> Thanks a lot in advance.
>
> Best regards
>
> Jochen
>
--
You received this message because you are subscribed to the Google Groups
"Google Web Toolkit" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/google-web-toolkit.
For more options, visit https://groups.google.com/groups/opt_out.