如何访问(修改、添加元素)java内部类中的ArrayList/集合?
我有这个搜索功能,可以使用GeoFire的firebase数据库搜索特定用户 我想做什么: 在如何访问(修改、添加元素)java内部类中的ArrayList/集合?,java,android,firebase,inner-classes,geofire,Java,Android,Firebase,Inner Classes,Geofire,我有这个搜索功能,可以使用GeoFire的firebase数据库搜索特定用户 我想做什么: 在GeoQueryEventListener()和onKeyEntered中,我想将找到的每个键添加到ArrayList中(在onKeyEntered()之外) 我遇到的问题: 当我在onKeyEntered()中打印它时,它可以工作。 但一旦退出GeoQueryEventListener(),keyGeoLocated就为空 public ArrayList<User> search(Geo
GeoQueryEventListener()
和onKeyEntered
中,我想将找到的每个键添加到ArrayList中(在onKeyEntered()
之外)
我遇到的问题:
当我在onKeyEntered()
中打印它时,它可以工作。
但一旦退出GeoQueryEventListener()
,keyGeoLocated
就为空
public ArrayList<User> search(GeoFire geoFire, int day, final boolean isBartender, double latitude, double longitude, double radius, double rate, double nightlyRate, double hourlyRate, final String speciality){
keysGeolocated = new ArrayList<>();
FirebaseDatabase database = FirebaseDatabase.getInstance();
root = database.getReference();
DatabaseReference usersRef = root.child("Users");
GeoQuery geoQuery = geoFire.queryAtLocation(new GeoLocation(latitude, longitude), radius);
geoQuery.addGeoQueryEventListener(new MyGeoListener(keysGeolocated));
System.out.println("KEYS GEOLOCATED" + keysGeolocated);
final ArrayList<User> result = new ArrayList<>();
for(String key : keysGeolocated){
Query queryByLocation = usersRef.orderByKey().equalTo(key);
DatabaseReference refToLocationQuery = queryByLocation.getRef();
if(checkRefNull(refToLocationQuery) == true) {
System.out.println("QUERY BY LOCATION NULL");
continue;
}
Query queryByTypeOfUser = refToLocationQuery.orderByChild("isBarTender").equalTo(isBartender);
DatabaseReference refToTypeOfUserQuery = queryByTypeOfUser.getRef();
if(checkRefNull(refToTypeOfUserQuery) == true) {
System.out.println("QUERY BY TYPE NULL");
continue;
}
Query queryByRate = refToTypeOfUserQuery.orderByChild("rate").startAt(rate);
DatabaseReference refToRateQuery = queryByRate.getRef();
if(checkRefNull(refToRateQuery) == true) {
System.out.println("QUERY BY RATE NULL");
continue;
}
DatabaseReference finalRef = null;
if(isBartender == true){
if(nightlyRate == 0){
Query queryByPrice = refToRateQuery.orderByChild("nightlyRate").endAt(nightlyRate);
finalRef = queryByPrice.getRef();
}
else if(hourlyRate == 0){
Query queryByPrice = refToRateQuery.orderByChild("hourlyRate").endAt(hourlyRate);
finalRef = queryByPrice.getRef();
}
//TODO Impelement checks for available dates
}
else{
finalRef = refToRateQuery;
}
finalRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot.getValue()!=null){
User userFound = dataSnapshot.getValue(User.class);
if(isBartender == true){
Bartender barTenderFound = (Bartender) userFound;
if(speciality != null){
if(barTenderFound.getSpeciality().contains(speciality)){
result.add(barTenderFound);
}
}
else{
result.add(barTenderFound);
}
}
else{
result.add(userFound);
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
return result;
}
public boolean checkRefNull(DatabaseReference ref){
final boolean[] result = new boolean[1];
result[0] = false;
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
System.out.println("TEST1");
if(dataSnapshot.getValue()==null){
result[0] = true;
System.out.println("TESTTEST");
}
else{
System.out.println("TESTTEST TRUE" + dataSnapshot.getValue());
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
return result[0];
}
public void setBarTender(boolean barTender){
this.barTender = barTender;
}
}
class MyGeoListener implements GeoQueryEventListener {
private ArrayList<String> keysGeolocated;
MyGeoListener(ArrayList<String> keysGeolocated){
this.keysGeolocated = keysGeolocated;
}
@Override
public void onKeyEntered(String key, GeoLocation location) {
keysGeolocated.add(key);
}
@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 GeoFire,int day,最终布尔值IsBartener,双纬度,双经度,双半径,双速率,双夜词,双小时词,最终字符串){
keyGeoLocated=newArrayList();
FirebaseDatabase=FirebaseDatabase.getInstance();
root=database.getReference();
DatabaseReference usersRef=root.child(“用户”);
GeoQuery GeoQuery=geoFire.queryLocation(新地理位置(纬度、经度)、半径);
addGeoQueryEventListener(新的MyGeoListener(KeyGeoLocated));
System.out.println(“键地理定位”+键地理定位);
最终ArrayList结果=新建ArrayList();
for(字符串键:KeyGeoLocated){
queryquerybylocation=usersRef.orderByKey().equalTo(key);
DatabaseReference refToLocationQuery=queryByLocation.getRef();
if(checkRefNull(refToLocationQuery)==true){
System.out.println(“按位置查询空”);
继续;
}
queryquerybytypeofuser=refToLocationQuery.orderByChild(“isBarTender”).equalTo(isBarTender);
DatabaseReference RefToTypeOfUseQuery=queryByTypeOfUser.getRef();
if(checkRefNull(refToTypeOfUserQuery)==true){
System.out.println(“按类型NULL查询”);
继续;
}
queryquerybyrate=reftotypeofuerquery.orderByChild(“rate”).startAt(rate);
DatabaseReference refToRateQuery=queryByRate.getRef();
if(checkRefNull(refToRateQuery)==true){
System.out.println(“按速率查询空”);
继续;
}
DatabaseReference finalRef=null;
如果(isBartender==true){
如果(nightlyRate==0){
queryquerybyprice=refToRateQuery.orderByChild(“nightlyRate”).endAt(nightlyRate);
finalRef=queryprice.getRef();
}
else if(hourlyRate==0){
queryquerybyprice=refToRateQuery.orderByChild(“hourlyRate”).endAt(hourlyRate);
finalRef=queryprice.getRef();
}
//TODO推进检查可用日期
}
否则{
finalRef=refToRateQuery;
}
finalRef.addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
if(dataSnapshot.getValue()!=null){
User userFound=dataSnapshot.getValue(User.class);
如果(isBartender==true){
调酒师调酒师发现=(调酒师)用户发现;
如果(特殊性!=null){
if(barTenderFound.getSpeciality().contains(speciality)){
结果。添加(调酒师发现);
}
}
否则{
结果。添加(调酒师发现);
}
}
否则{
result.add(userFound);
}
}
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
}
返回结果;
}
公共布尔值checkRefNull(DatabaseReference){
最终布尔值[]结果=新布尔值[1];
结果[0]=假;
ref.addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
System.out.println(“TEST1”);
if(dataSnapshot.getValue()==null){
结果[0]=真;
System.out.println(“TESTTEST”);
}
否则{
System.out.println(“TESTTEST TRUE”+dataSnapshot.getValue());
}
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
返回结果[0];
}
公共调酒师(布尔调酒师){
这个调酒师=调酒师;
}
}
类MyGeoListener实现GeoQueryEventListener{
私有ArrayList密钥定位;
MyGeoListener(ArrayList键GeoLocated){
this.keysGeolocated=keysGeolocated;
}
@凌驾
public void onKeyEntered(字符串键、地理位置){
keyGeoLocated.add(key);
}
@凌驾
public void onKeyExited(字符串键){
}
@凌驾
public void onKeyMoved(字符串键、地理位置){
}
@凌驾
公共无效onGeoQueryReady(){
}
@凌驾
公共无效onGeoQueryError(数据库错误){
}
}
创建一个类来扩展该侦听器并重写所有方法
class MyGeoListener extends GeoQueryEventListener{
private ArrayList<String> keysGeolocated;
MyGeoListener(ArrayList<String> keysGeolocated){
this.keysGeolocated = keysGeolocated;
}
@Override
public void onKeyEntered(String key, GeoLocation location) {
keysGeolocated.add(key);
System.out.println("1111111111 : "+keysGeolocated);
System.out.println("2222222222 : "+key);
}
@Override
public void onKeyExited(String key) {
}
@Override
public void onKeyMoved(String key, GeoLocation location) {
}
@Override
public void onGeoQueryReady() {
}
@Override
public void onGeoQueryError(DatabaseError error) {
}
}
紧接着的下一个调用将始终不打印列表中的值,因为侦听器是异步的,并且需要时间来填充列表
尝试将打印放入延迟30000毫秒的处理程序postdelayed中。您可能会在列表中看到条目,因为此时侦听器事件应该已触发
由于arraylist是可变的,并且您正在传递它的引用,因此当侦听器调用时,参数中的arraylist也将被修改
祝你好运,如果还有问题,请告诉我。更改范围。不能是该方法的本地。您假定侦听器会产生即时结果。如果是同步的,您的呼叫将打印列表。
geoQuery.addGeoQueryEventListener(new MyGeoListener(keysGeolocated));