java - addValueEventListener后ArrayList变为null

标签 java android arrays arraylist

我试图在 RecyclerView 中显示一些项目,这些项目包含在填充有 RealtimeDatabase (Firebase) 数据的 ArrayList 中。每次在数据库中检测到某些更改时都会执行此操作,如下所示。问题是 lstCompanyaddValueEventListener 之后很快就变为 null。我怎样才能保持它的实现?

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,这种情况不应该发生。

最佳答案

在onCreate中初始化arraylist,并在onDataChange上添加数据时通知适配器数据已更改

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);


    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState){
        v = inflater.inflate(R.layout.fragment_companies,container,false);

        lstCompany = new ArrayList<>();
        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);

        db = FirebaseDatabase.getInstance().getReference();
        db.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                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);
                    System.out.println(c.getCompanyName);
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
        System.out.println(lstCompany);





        return v;
    }
}

关于java - addValueEventListener后ArrayList变为null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56985424/

相关文章:

java - 为信用卡生成随机数

java - Eclipse 无法删除 lib.jar

android - 将外部Sqlite与SimpleCursorAdapter一起使用时应用崩溃

javascript - 在 JavaScript 中使用 array.push() 后数组长度不正确

java - Elasticsearch - EdgeNgram + highlight + term_vector = 不好的亮点

java - 仅当 Optional 存在时才解包

java 日期格式错误响应

c# - “标准化”概率数组

ruby-on-rails - 使用 Ruby 通过嵌套 JSON 对象进行过滤并获取具有特定键的 JSON

java - 当字段名称与局部变量相同时如何访问字段?