java - 过滤和加载数据,比较firebase android中的值

标签 java android firebase filter load

我想显示当前用户中按projectName排序的ListTesting数据。我尝试了这个,但它不起作用(数据未显示):

    public View onCreateView(@NonNull LayoutInflater inflater,
                         ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_list_testing, container, false);
if (getActivity() != null)
        Objects.requireNonNull(((AppCompatActivity) getActivity()).getSupportActionBar()).hide();

    firebaseAuth = FirebaseAuth.getInstance();

    DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("Users");
    Query query = databaseReference.orderByChild("id").equalTo(myId);
    query.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for (DataSnapshot dataSnapshot1:dataSnapshot.getChildren()){
                projectName = "" +dataSnapshot1.child("projectName").getValue();
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

    //rv and properties
    rvListTest = view.findViewById(R.id.rv_postsListTest);
    FloatingActionButton fabAddListTest = view.findViewById(R.id.fab_addListTest);

    fabAddListTest.setOnClickListener(view1 -> startActivity(new Intent(getActivity(), AddListTestingActivity.class)));
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
    //show newest post first
    linearLayoutManager.setStackFromEnd(true);
    linearLayoutManager.setReverseLayout(true);

    //set layout to rv
    rvListTest.setLayoutManager(linearLayoutManager);

    listTestings = new ArrayList<>();

    checkUserStat();
    loadPosts();
    EditText search_listTest = view.findViewById(R.id.search_listTest);
    search_listTest.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
            String searchUsers = search_listTest.getText().toString().trim();
            if (!searchUsers.isEmpty()){
                rvListTest.setVisibility(View.VISIBLE);
                searchListTest(charSequence.toString().toLowerCase());
            }
        }

        @Override
        public void afterTextChanged(Editable editable) {

        }
    });
    return view;
}

private void checkUserStat() {
    FirebaseUser user = firebaseAuth.getCurrentUser();
    if (user != null) {
        myId = user.getUid();
    } else {
        startActivity(new Intent(getActivity(), ErrorActivity.class));
        requireActivity().finish();
    }
}

private void loadPosts() { //path of all posts
    DatabaseReference reference = FirebaseDatabase.getInstance().getReference("ListTesting");
    //query to load posts
    Query query = reference.orderByChild("projectName").equalTo(projectName);
    //get all data from node Posts
    query.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            listTestings.clear();
            for (DataSnapshot ds : dataSnapshot.getChildren()) {
                ListTesting listTesting = ds.getValue(ListTesting.class);

                listTestings.add(listTesting);

                //adapter
                adapter = new ListTestingAdapter(getActivity(), listTestings);
                //set adapter to rv
                rvListTest.setAdapter(adapter);
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            //if error
            Toast.makeText(getActivity(), "" + databaseError.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });
}`

enter image description here

enter image description here

最佳答案

您无法为 Firebase 数据库中的值创建全局变量,因为该数据库是异步的,这意味着需要一些时间才能从数据库获取值。

有两个选项可以解决此问题:

1-将代码放入 firebase 监听器中,在您的情况下如下

DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("Users");
Query query = databaseReference.orderByChild("id").equalTo(myId);
query.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        for (DataSnapshot dataSnapshot1:dataSnapshot.getChildren()){
            projectName = "" +dataSnapshot1.child("projectName").getValue();
        }

     //then here put your code that exists in loadPosts function

     DatabaseReference reference = 
     FirebaseDatabase.getInstance().getReference("ListTesting");
     //query to load posts
     Query query = reference.orderByChild("projectName").equalTo(projectName);

     //get all data from node Posts
     query.addValueEventListener(new ValueEventListener() {
     @Override
     public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        listTestings.clear();
        for (DataSnapshot ds : dataSnapshot.getChildren()) {
            ListTesting listTesting = ds.getValue(ListTesting.class);

            listTestings.add(listTesting);

            //adapter
            adapter = new ListTestingAdapter(getActivity(), listTestings);
            //set adapter to rv
            rvListTest.setAdapter(adapter);
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        //if error
        Toast.makeText(getActivity(), "" + databaseError.getMessage(), 
        Toast.LENGTH_SHORT).show();
    }
});

    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {

    }
});

2- 创建您自己的回调以等待 Firebase 返回您的数据,例如 this .

希望这对你有帮助:)

关于java - 过滤和加载数据,比较firebase android中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62187299/

相关文章:

Android 代码在两个或多个不同的自定义 View 上应用相同的双击触摸监听器

java - Android 隐藏来自 Firebase 的通知

java - 按业务逻辑 ID 对列表进行排序

java - 按钮布局较高

android - menu.xml 中的 ActionbarSherlock SearchView 给出 Resources$NotFoundException

android - 使用 Deeplink 引导用户使用 Uber for Business

android - 错误 :(53, 29) 找不到错误 : cannot access zzbti class file for com. google.android.gms.internal.zzbti

swift - 无法将所有 firebase 数据显示为折线图

java - 解压嵌套的 jar 文件 java

java - StackExchange API - 反序列化 JSON 响应中的日期