我有2个视图和2个演示者的应用程序。我有一个固定的顶级菜单,其中包含一个使用SuggestionBox的搜索框。我从数据库中获取建议列表,并使用addAll(..)方法将其加载到SuggestionBox的MultiWordSuggestOracle中。
我正在使用UiBinder,这是我的代码:
@UiField (provided=true) SuggestBox searchEntriesSuggestBox;
MultiWordSuggestOracle oracle;
public MenuBar() {
oracle = new MultiWordSuggestOracle();
searchEntriesSuggestBox = new SuggestBox(oracle);
initWidget(uiBinder.createAndBindUi(this));
}
public void loadUserEntries(Collection<String> entries){
oracle.clear();
oracle.addAll(entries);
}
我第一次运行应用程序时,使用loadUserEntries()加载建议。问题是当我更改我的View(和Presenter)时,因为SuggestBox加载了一个空的MultiWordSuggestOracle,所以每次我更改我的Presenter时我都要再次加载这些建议。
我想在应用程序的生命周期中将建议(MultiWordSuggestOracle)保留为全局变量,以避免使用loadUserEntries方法。
我尝试定义一个全局变量MultiWordSuggestOracle,每次我必须加载Presenter时,使用我的全局MultiWordSuggestOracle创建一个新的SuggestBox。但它没有用。
有什么想法吗?
感谢。
答案 0 :(得分:1)
问题是每个视图都使用自己的MenuBar实例,因为每个视图都创建自己的实例。
有多种方法可以解决您的问题,您可以使用多个ActivityManagers
,就像在此post中解释的那样,或者您可以在UI中使用MenuBar从MVP中获得固定部分显示,或简单的解决方案是使用静态变量并使load方法静态(只调用此方法一次)。
@UiField (provided=true) SuggestBox searchEntriesSuggestBox;
static MultiWordSuggestOracle oracle = null;
public MenuBar() {
if (oracle == null) {
oracle = new MultiWordSuggestOracle();
}
searchEntriesSuggestBox = new SuggestBox(oracle);
initWidget(uiBinder.createAndBindUi(this));
}
public static void loadUserEntries(Collection<String> entries){
oracle.clear();
oracle.addAll(entries);
}