在片段中设置Firebase AddValueEventListener的位置?

时间:2016-12-12 02:16:30

标签: android android-fragments firebase firebase-realtime-database

我正在创建一个带有从Firebase中提取数据的片段的Android应用。

目前,我已将addValueEventListener设置在onStart()方法中,该方法可以在第一次访问片段时从Firebase提取数据,但是当我更改为在应用中查看其他片段时并返回原始片段,Firebase数据消失,直到我旋转屏幕。

我应该在哪里放置AddValueEventListener方法来解决这个问题?

2 个答案:

答案 0 :(得分:3)

简答:将其添加到onResume方法中,然后使用onPause方法将其删除。

答案很长: 片段由FragmentManager管理,在大多数情况下,片段保留片段的实例,以便每次要显示片段时都不需要创建新片段。因此,在创建片段或配置更改(即屏幕旋转)时,方法onCreateonCreateViewonStart将被调用一次。

另一方面,每当片段获得焦点时,都会调用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