代码之家  ›  专栏  ›  技术社区  ›  Vector

FireBase回收视图适配器

  •  0
  • Vector  · 技术社区  · 6 年前

    我们有一个与RecyclerView适配器和一个模型类接口的传统ListView。当我们登录到firebase时,我们导航到listview,listview中没有加载任何内容。然后我们返回到登录活动并重复该过程 然后从一个非常简单的db子节点表列表中加载所有数据。 我们厌倦了FireBase Recycleradapter,没有运气,我们可能有错误的用户界面或版本。我们的问题是,为什么我们需要两次访问列表视图来加载数据?我们将发布listview代码。没有生成错误。我们尝试将代码放在onstart方法中。没有成功。

            db = FirebaseDatabase.getInstance().getReference();
        dbRef = db.child("Table List");
    
        dbRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
    
                for (DataSnapshot child : dataSnapshot.getChildren())
                    listArrayList.add(child.getValue(String.class));
                sz = listArrayList.size();
            }
    
            @Override
            public void onCancelled(DatabaseError databaseError) {
    
            }
        });
    
        sz = listArrayList.size();
    
        if(sz == 0){
            tvNoData.setVisibility(View.VISIBLE);
            tvNoData.setText("No Quiz's Found\n\nClick On Make New Quiz");
    
            mRecyclerView = findViewById(R.id.recycleview);
            mRecyclerView.setHasFixedSize(true);
    
            mLayoutManager = new LinearLayoutManager(this);
            mRecyclerView.setLayoutManager(mLayoutManager);
    
            mAdapter = new TableTrackerAdapter(this,listArrayList);
            mRecyclerView.setAdapter(mAdapter);
        }
    
        if(sz > 0){
            tvNoData.setVisibility(View.INVISIBLE);
    
            mRecyclerView = findViewById(R.id.recycleview);
            mRecyclerView.setHasFixedSize(true);
    
            mLayoutManager = new LinearLayoutManager(this);
            mRecyclerView.setLayoutManager(mLayoutManager);
    
            mAdapter = new TableTrackerAdapter(this,listArrayList);
            mRecyclerView.setAdapter(mAdapter);
    
        }
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Daiwik Dan    6 年前

    原因是因为firebase数据库是异步的,换句话说,在firebase加载完数据之前,recyclerview将被一个空的arraylist填充,我以前遇到过类似的问题。

    只需在FireBase DataChange中移动依赖于ArrayList的所有内容,问题就会像这样解决。

    public void setupRecyclerView(){
    
        if(sz == 0){
            tvNoData.setVisibility(View.VISIBLE);
            tvNoData.setText("No Quiz's Found\n\nClick On Make New Quiz");
    
            mRecyclerView = findViewById(R.id.recycleview);
            mRecyclerView.setHasFixedSize(true);
    
            mLayoutManager = new LinearLayoutManager(MainActivity.this);
            mRecyclerView.setLayoutManager(mLayoutManager);
    
            mAdapter = new TableTrackerAdapter(MainActivity.this,listArrayList);
            mRecyclerView.setAdapter(mAdapter);
        }
    
        if(sz > 0){
            tvNoData.setVisibility(View.INVISIBLE);
    
            mRecyclerView = findViewById(R.id.recycleview);
            mRecyclerView.setHasFixedSize(true);
    
            mLayoutManager = new LinearLayoutManager(MainActivity.this);
            mRecyclerView.setLayoutManager(mLayoutManager);
    
            mAdapter = new TableTrackerAdapter(MainActivity.this,listArrayList);
            mRecyclerView.setAdapter(mAdapter);
    
        }
    }
    
    db = FirebaseDatabase.getInstance().getReference();
    dbRef = db.child("Table List");
    dbRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if(dataSnapshot != null){
                for (DataSnapshot child : dataSnapshot.getChildren()){
                    listArrayList.add(child.getValue(String.class));
                }
            sz = listArrayList.size();
            setupRecyclerView();
            }
    
        }
    
        @Override
        public void onCancelled(DatabaseError databaseError) {
    
        }
    });