地理查询内的地图返回 null
Posted
技术标签:
【中文标题】地理查询内的地图返回 null【英文标题】:Map inside geoquery returns null 【发布时间】:2018-11-25 03:53:18 【问题描述】:我正在尝试从地理查询中检索值。这些值被添加到地图中,但是当我返回这些值时,地图为空。
这里myPosition
是我用于我的位置的位置 Latlng 值。
我已经编辑了问题,但仍然出现问题地图仍然是空的
private Map<String, GeoLocation> geoMap;
public View onCreateView(LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState)
View view= inflater.inflate
(R.layout.fragment_new_search2, container, false);
geoMap= new HashMap<>();
readdata(new MyCallback()
@Override
public void onCallback(Map<String,
GeoLocation> geomap)
// int size = geomap.size();
);
int size = geoMap.size();
Toast.makeText(getContext(),
String.valueOf(size), Toast.LENGTH_SHORT).show();
return view;
private void readdata(final MyCallback myCallback)
DatabaseReference ref =
FirebaseDatabase.getInstance().getReference()
.child("WorkLocation");
GeoFire geoFire = new GeoFire(ref);
GeoQuery geoQuery = geoFire.queryAtLocation(new GeoLocation(myPosition.latitude, myPosition.longitude), 2);
geoQuery.addGeoQueryEventListener(new GeoQueryEventListener()
@Override
public void onKeyEntered(String key, GeoLocation location)
geoMap.put(key,location);
@Override
public void onKeyExited(String key)
@Override
public void onKeyMoved(String key, GeoLocation location)
@Override
public void onGeoQueryReady()
@Override
public void onGeoQueryError(DatabaseError error)
);
myCallback.onCallback(geoMap);
public interface MyCallback
void onCallback(Map<String, GeoLocation> geomap);
我在onkeyentered
中尝试了一个 toast,值在那里并且正在被添加,但仍然没有返回到方法中,并且地图的大小仍然为零。
【问题讨论】:
addGeoQueryEventListener
回调方法被异步调用
How to return dataSnapshot value as a result of a method?的可能重复
请检查副本以了解为什么会出现这种行为以及如何使用自定义回调来解决此问题。
@AlexMamo 我已经更改了代码,但大小仍然为零,代码还有什么问题
@JohnO'Reilly 我已经更改了代码,您可以再检查一下吗
【参考方案1】:
所有需要加载数据的代码都必须在on...
方法内部(或从内部调用)。所以:
DatabaseReference ref =
FirebaseDatabase.getInstance().getReference()
.child("WorkLocation");
GeoFire geoFire = new GeoFire(ref);
GeoQuery geoQuery = geoFire.queryAtLocation(new GeoLocation(myPosition.latitude, myPosition.longitude), 2);
geoQuery.addGeoQueryEventListener(new GeoQueryEventListener()
@Override
public void onKeyEntered(String key, GeoLocation location)
geoMap.put(key,location);
myCallback.onCallback(geoMap);
@Override
public void onKeyExited(String key)
@Override
public void onKeyMoved(String key, GeoLocation location)
@Override
public void onGeoQueryReady()
@Override
public void onGeoQueryError(DatabaseError error)
);
如果您只想在通过 Geofire 加载所有初始密钥后调用您的 onCallback
,请将其放入 onGeoQueryReady
:
DatabaseReference ref =
FirebaseDatabase.getInstance().getReference()
.child("WorkLocation");
GeoFire geoFire = new GeoFire(ref);
GeoQuery geoQuery = geoFire.queryAtLocation(new GeoLocation(myPosition.latitude, myPosition.longitude), 2);
geoQuery.addGeoQueryEventListener(new GeoQueryEventListener()
@Override
public void onKeyEntered(String key, GeoLocation location)
geoMap.put(key,location);
@Override
public void onKeyExited(String key)
@Override
public void onKeyMoved(String key, GeoLocation location)
@Override
public void onGeoQueryReady()
myCallback.onCallback(geoMap);
@Override
public void onGeoQueryError(DatabaseError error)
);
【讨论】:
非常感谢,有什么方法可以循环遍历地图,即使我将它放在 onKeyEntered 中。我在另一个问题中问过它,请你看一下***.com/questions/50877806/… 您现在可以看一下吗?我想对回收站视图进行分页,如果我有一个包含密钥的地图,我不知道该怎么做。这意味着我现在必须对地图中的条目进行分页,但我不知道该怎么做 GeoQuery geoQuery = geoFire.queryAtLocation(new GeoLocation(myPosition.latitude, myPosition.longitude), 2);在我的 readData 方法中,我在预定义的纬度和经度上传递我的值。我如何在这个 readData 方法中添加一个变量以上是关于地理查询内的地图返回 null的主要内容,如果未能解决你的问题,请参考以下文章