【发布时间】:2019-07-11 09:01:25
【问题描述】:
我试图在 RecyclerView 中显示一些项目,这些项目包含在填充有 RealtimeDatabase (Firebase) 数据的 ArrayList 中。每次在数据库中检测到一些更改时都会执行此操作,如下所示。问题是lstCompany 在addValueEventListener 之后很快变为空。我怎样才能让它实现?
public class FragmentCompanies extends Fragment {
View v;
private RecyclerView recyclerView;
private List<Company> lstCompany;
DatabaseReference db;
public FragmentCompanies(){}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
db = FirebaseDatabase.getInstance().getReference();
db.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
lstCompany = new ArrayList<>();
DataSnapshot ds = dataSnapshot.child("Company");
for (DataSnapshot company: ds.getChildren()){
Map<String, String> currCompany = (Map) company.getValue();
Company c = new Company(currCompany.get("name"), currCompany.get("overview"), currCompany.get("imageURL"));
lstCompany.add(c);
System.out.println(lstCompany);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
System.out.println(lstCompany);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState){
v = inflater.inflate(R.layout.fragment_companies,container,false);
System.out.println(lstCompany);
//bind the adapter to the recyclerView
recyclerView = v.findViewById(R.id.companies_recyclerview);
CompaniesRecyAdapter recyAdapter = new CompaniesRecyAdapter(getContext(), lstCompany);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
recyclerView.setAdapter(recyAdapter);
return v;
}
}
最后两个 println 操作返回 null,它不应该发生。
【问题讨论】:
-
这是一个回调。
lstCompany在您的ValueEventListener之外为空,因为尚未调用onDataChange。 -
是的,感谢您的解释。但是,每次数据库中的数据发生变化时,如何让 RecyclerView 更新呢?考虑到由于 Firebase db 需要回调...
-
您不能从
onDataChange调用您需要的任何更新吗?这就是回调的用途......
标签: java android arrays arraylist