在Android

时间:2018-03-17 16:32:21

标签: android firebase google-cloud-firestore

我正在尝试从Firestore中检索一个我已存储并在活动中显示它的Events对象。我将文档定位在文档引用中,然后使用setEvent方法将文档(转换为Event对象)设置为" thisEvent"变量在开始时声明。

但是,当我使用事件中的信息设置TextViews时,它不起作用,因为thisEvent为null。我已经设置了一个if / else来查看它是否为null,因此每次运行应用程序时,都不显示事件,而是HEY THERE是if语句的事件标题。我已经按照他们网站上列出的Firestore文档进行了操作,但似乎我没有按照正确的方式进行操作。

public class EventViewActivity extends AppCompatActivity {

//declaring FireBase variables
private FirebaseFirestore mFStore;
private FirebaseAuth mAuth;

//declaring user,team and event variables
private String user_id;
private String team_id;
private String TAG = "EventViewActivity";
String event_id;
Event thisEvent;

//declaring and binding UI elements
@BindView(R.id.event_title_text) TextView event_title;
@BindView(R.id.event_date_text)TextView event_date;
@BindView(R.id.event_time_text)TextView event_time;
@BindView(R.id.event_description_text)TextView event_description;
@BindView(R.id.event_location_text)TextView event_location;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_event_view);
    ButterKnife.bind(this);
    mAuth = FirebaseAuth.getInstance();
    mFStore = FirebaseFirestore.getInstance();
    Intent intent = getIntent();
    event_id = intent.getExtras().getString("event_id");
    Log.d(TAG, "eventid: " + event_id);

    //retrieve event information
    DocumentReference eventInfoRef = mFStore.collection("Teams/YfLa27NWaaQSfNwhZPgX/Events").document("MhEg0kRdJEedf7YnwvBi");
    eventInfoRef.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
        @Override
        public void onSuccess(DocumentSnapshot documentSnapshot) {
            setEvent(documentSnapshot.toObject(Event.class));
        }
    });
    if (thisEvent !=null){
    event_title.setText(this.thisEvent.getTitle());
    event_date.setText(thisEvent.getDate().toString());
    event_time.setText(thisEvent.getTime());
    event_description.setText(thisEvent.getDescription());
    event_location.setText(thisEvent.getLocation());}
    else {
        event_title.setText("HEY THERE");
    }
}

public void setEvent(Event event){
    this.thisEvent = event;
}

}

1 个答案:

答案 0 :(得分:1)

您不能将Event类型的变量声明为全局变量,只需在onSuccess()方法之外使用它即可。发生这种情况是因为此方法具有异步行为,这意味着甚至在从数据库获取数据之前就会调用此方法。快速解决方法是仅在Event方法中使用onSuccess()对象,或者如果您想在外面使用它,请使用此 post的答案的最后一部分即可。您还可以查看 video