TextView调用setText无变化求助:Firebase数据绑定失效
嘿,找到问题啦!你的TextView不更新是因为返回了错误的View实例
你遇到的这个问题其实是Android Fragment开发里一个非常常见的小失误——你在onCreateView里明明已经把布局加载到了view变量里,还在上面绑定了Firebase的监听器,但最后却返回了一个全新的、完全没关联的布局实例!
具体哪里错了?
看你onCreateView的最后一行代码:
return inflater.inflate(R.layout.fragment_account, container, false);
而你之前已经正确加载了布局到view对象:
view = inflater.inflate(R.layout.fragment_account, container, false);
这就意味着:你在Firebase监听器里操作的yourGroupId是属于第一个view的,但实际显示在屏幕上的却是第二个新inflate出来的布局。相当于你在一张草稿纸上写了字,却把另一张空白纸贴到了墙上,当然看不到内容啦!
怎么修复?
只需要把返回值改成你已经初始化好的view就行,一行代码的事:
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment view = inflater.inflate(R.layout.fragment_account, container, false); currentUserID = FirebaseAuth.getInstance().getCurrentUser().getUid(); UsersRef = FirebaseDatabase.getInstance().getReference().child("Users").child(currentUserID); UsersRef.addValueEventListener(new ValueEventListener() { public void onDataChange(DataSnapshot dataSnapshot) { currentGroupID = dataSnapshot.child("group_1").getValue(String.class); yourGroupId = (TextView)view.findViewById(R.id.groupid); yourGroupId.setText(""+currentGroupID); UserInformation user_i = new UserInformation(); user_i.setGroupId(currentGroupID); list_account_data(user_i); } public void onCancelled(DatabaseError error) { // Failed to read value Log.w("New Tag", "Failed to read value.", error.toException()); } }); // 把我们已经绑定了逻辑的view返回给系统 return view; }
额外给你两个优化小建议
- 提前初始化TextView:把
yourGroupId的findViewById移到监听器外面,不用每次数据变化都重新查找控件,效率更高:
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { view = inflater.inflate(R.layout.fragment_account, container, false); // 提前找到TextView,避免重复查找 yourGroupId = (TextView)view.findViewById(R.id.groupid); currentUserID = FirebaseAuth.getInstance().getCurrentUser().getUid(); UsersRef = FirebaseDatabase.getInstance().getReference().child("Users").child(currentUserID); UsersRef.addValueEventListener(new ValueEventListener() { public void onDataChange(DataSnapshot dataSnapshot) { currentGroupID = dataSnapshot.child("group_1").getValue(String.class); yourGroupId.setText(""+currentGroupID); UserInformation user_i = new UserInformation(); user_i.setGroupId(currentGroupID); list_account_data(user_i); } public void onCancelled(DatabaseError error) { Log.w("New Tag", "Failed to read value.", error.toException()); } }); return view; }
- 处理空指针风险:记得判断
FirebaseAuth.getInstance().getCurrentUser()是否为null,防止用户未登录时出现崩溃。
内容的提问来源于stack exchange,提问作者LordoButter
相关产品推荐
相关产品推荐

