我正在创建一个带有从Firebase中提取数据的片段的Android应用。
目前,我已将addValueEventListener
设置在onStart()
方法中,该方法可以在第一次访问片段时从Firebase提取数据,但是当我更改为在应用中查看其他片段时并返回原始片段,Firebase数据消失,直到我旋转屏幕。
我应该在哪里放置AddValueEventListener
方法来解决这个问题?
答案 0 :(得分:3)
简答:将其添加到onResume
方法中,然后使用onPause
方法将其删除。
答案很长:
片段由FragmentManager管理,在大多数情况下,片段保留片段的实例,以便每次要显示片段时都不需要创建新片段。因此,在创建片段或配置更改(即屏幕旋转)时,方法onCreate
,onCreateView
,onStart
将被调用一次。
另一方面,每当片段获得焦点时,都会调用onResume
方法,因此将始终调用添加addValueEventListener
。但是,这将导致甚至监听者增加多个价值,因此removeEventListener
方法中的onPause
是一个好习惯。
请参阅:https://developer.android.com/guide/components/fragments.html
答案 1 :(得分:0)
只需在Fragment的addValueEventListener
方法中添加onCreateView()
即可。然后将值存储到ArrayList
或任何其他集合类中。只需将ArrayList
中的值显示为Fragment
即可。
注意:您无法存储outside the onDataChange()
addValueEventListener
方法的值onDataChange()
。因此,只需使用arraylist param创建一个方法,并将值从null
方法传递给新创建的方法。这样,您的数据不应为NullPointerException
,您将无法获得public enum EventType {
EventA {
// cannot call this method
public Map<String, Map<String, String>> execute(String eventMapHolder) {
final Map<String, String> holder = parseStringToMap(eventMapHolder);
if (holder.isEmpty() || Strings.isNullOrEmpty(holder.get("m_itemId"))) {
return ImmutableMap.of();
}
String itemId = holder.get("m_itemId");
Map<String, String> clientInfoHolder = getClientInfo(itemId);
holder.putAll(clientInfoHolder);
return ImmutableMap.<String, Map<String, String>>builder().put(EventA.name(), holder)
.build();
}
},
EventB {
// cannot call this method
public Map<String, Map<String, String>> execute(String eventMapHolder) {
final Map<String, String> holder = parseStringToMap(eventMapHolder);
if (holder.isEmpty() || Strings.isNullOrEmpty(holder.get("m_itemId"))) {
return ImmutableMap.of();
}
return ImmutableMap.<String, Map<String, String>>builder().put(EventB.name(), holder)
.build();
}
};
public Map<String, String> parseStringToMap(String eventMapHolder) {
// parse eventMapHolder String to Map
}
public Map<String, String> getClientInfo(final String clientId) {
Map<String, String> clientInfoMap = Maps.newHashMap();
// code to populate this map
return clientInfoMap;
}
public Map<String, String> getDeviceInfo(final String itemId) {
Map<String, String> deviceInfoMap = Maps.newHashMap();
// code to populate this map
return deviceInfoMap;
}
}
有关详细信息,请参阅此doc。