【问题标题】:Firestore data not showing in recycler viewFirestore 数据未显示在回收站视图中
【发布时间】:2022-01-13 12:11:45
【问题描述】:

我正在尝试从 Firestore 在我的回收站视图中添加数据。 我有名称为 (Level+"levelNo.") 的文件 但我的活动没有显示任何内容 代码如下:

主要活动:

public class LevelActivity extends AppCompatActivity {
    // Recycler View object
    RecyclerView recyclerView;

    // Array list for recycler view data source
    public static List<String> levelList = new ArrayList<>();

    // Layout Manager
    RecyclerView.LayoutManager RecyclerViewLayoutManager;

    // adapter class object
    LevelAdapter adapter;

    // Linear Layout Manager
    LinearLayoutManager HorizontalLayout;

    FirebaseFirestore firebaseFirestore;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_level);

        // initialisation with id's
        recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
        RecyclerViewLayoutManager = new LinearLayoutManager(getApplicationContext());

        // Set LayoutManager on Recycler View
        recyclerView.setLayoutManager(RecyclerViewLayoutManager);

        firebaseFirestore = FirebaseFirestore.getInstance();

        loadLevel();
        // calling constructor of adapter
        // with source list as a parameter
        adapter = new LevelAdapter(levelList);

        // Set Horizontal Layout Manager
        // for Recycler view
        HorizontalLayout = new LinearLayoutManager(LevelActivity.this, LinearLayoutManager.HORIZONTAL, false);
        recyclerView.setLayoutManager(HorizontalLayout);

        // Set adapter on recycler view
        recyclerView.setAdapter(adapter);
    }

    private void loadLevel(){
        levelList.clear();

        firebaseFirestore.collection("QUIZ LEVELS")
                .document("TOTAL_LEVELS").get()
                .addOnCompleteListener(task -> {
                    if (task.isSuccessful()) {
                        DocumentSnapshot doc = task.getResult();
                        if (doc.exists()) {
                            long levelCount = (long) doc.get("count");

                            for (int i = 1; i <= levelCount; i++) {
                                String levelName = doc.getString("LEVEL" + i);
                                levelList.add(levelName);
                            }

                        }else{
                            Toast.makeText(LevelActivity.this, "no level", Toast.LENGTH_SHORT).show();
                        }

                    }else{

                        Toast.makeText(LevelActivity.this, task.getException().getMessage(), Toast.LENGTH_SHORT).show();
                    }
                });
    }

}

电平适配器:

public class LevelAdapter extends RecyclerView.Adapter<LevelAdapter.MyView> {

    // List with String type
    private final List<String> levelList;

    // View Holder class which
    // extends RecyclerView.ViewHolder
    public class MyView extends RecyclerView.ViewHolder {
        // Text View
        TextView textView;

        // parameterised constructor for View Holder class
        // which takes the view as a parameter
        public MyView(View view) {
            super(view);
            // initialise TextView with id
            textView = (TextView) view.findViewById(R.id.textview);
        }
    }

    // Constructor for adapter class
    // which takes a list of String type
    public LevelAdapter(List<String> horizontalList) {
        this.levelList = horizontalList;
    }

    // Override onCreateViewHolder which deals
    // with the inflation of the card layout
    // as an item for the RecyclerView.
    @Override
    public MyView onCreateViewHolder(ViewGroup parent, int viewType) {
        // Inflate item.xml using LayoutInflator
        View itemView
                = LayoutInflater
                .from(parent.getContext())
                .inflate(R.layout.recycler_view_item,
                        parent, false);

        // return itemView
        return new MyView(itemView);
    }

    // Override onBindViewHolder which deals
    // with the setting of different data
    // and methods related to clicks on
    // particular items of the RecyclerView.
    @Override
    public void onBindViewHolder(final MyView holder, final int position) {
        // Set the text of each item of
        // Recycler view with the list items
        holder.textView.setText(levelList.get(position));
    }

    // Override getItemCount which Returns
    // the length of the RecyclerView.
    @Override
    public int getItemCount() {
        return levelList.size();
    }
}

【问题讨论】:

    标签: java android google-cloud-firestore android-recyclerview adapter


    【解决方案1】:

    从 firestore/firebase 加载数据需要一些时间,您应该在从文档获得响应后在负载级别调用 set adapter

     RecyclerView recyclerView;
    
     // Array list for recycler view data source
     public static List<String> levelList = new ArrayList<>();
    
    // Layout Manager
    RecyclerView.LayoutManager RecyclerViewLayoutManager;
    
    // adapter class object
    LevelAdapter adapter;
    
    // Linear Layout Manager
    LinearLayoutManager HorizontalLayout;
    
    FirebaseFirestore firebaseFirestore;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_level);
    
    
    // initialisation with id's
    recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
    RecyclerViewLayoutManager = new 
    LinearLayoutManager(getApplicationContext());
    
    // Set LayoutManager on Recycler View
    recyclerView.setLayoutManager(RecyclerViewLayoutManager);
    
    firebaseFirestore = FirebaseFirestore.getInstance();
    
     HorizontalLayout = new LinearLayoutManager(LevelActivity.this, 
    LinearLayoutManager.HORIZONTAL, false);
    recyclerView.setLayoutManager(HorizontalLayout);
    
     loadLevel();
    
    
    
    
     }
    
    private void loadLevel(){
    levelList.clear();
    
         firebaseFirestore.collection("QUIZ LEVELS")
            .document("TOTAL_LEVELS").get()
            .addOnCompleteListener(task -> {
                if (task.isSuccessful()) {
                    DocumentSnapshot doc = task.getResult();
                    if (doc.exists()) {
                        long levelCount = (long) doc.get("count");
    
                        for (int i = 1; i <= levelCount; i++) {
                            String levelName = doc.getString("LEVEL" + i);
                            levelList.add(levelName);
                        }
                      //Set Adapter here
                      adapter = new LevelAdapter(levelList);
    
    
    
    
                     // Set adapter on recycler view
                     recyclerView.setAdapter(adapter);
    
                    }else{
                        Toast.makeText(LevelActivity.this, "no level", 
     Toast.LENGTH_SHORT).show();
                    }
    
                }else{
    
                    Toast.makeText(LevelActivity.this, 
     task.getException().getMessage(), Toast.LENGTH_SHORT).show();
                }
            });
    }
    

    【讨论】:

      【解决方案2】:

      数据是从 Firebase 异步加载的,因为从基于云的数据库中获取数据需要一些时间。这意味着最初您的适配器使用空的levelList 呈现回收器视图。

      然后当数据从网络返回时,您的addOnCompleteListener 会被调用并将数据添加到levelList。但此时,您需要通过调用 notifyDataSetChanged() 来告诉适配器您更改了数据并且需要重新渲染。

      所以在你将所有数据添加到levelList 之后,在你的addOnCompleteListener 调用adapter.notifyDataSetChanged()

      firebaseFirestore.collection("QUIZ LEVELS")
              .document("TOTAL_LEVELS").get()
              .addOnCompleteListener(task -> {
                  if (task.isSuccessful()) {
                      DocumentSnapshot doc = task.getResult();
                      if (doc.exists()) {
                          long levelCount = (long) doc.get("count");
      
                          for (int i = 1; i <= levelCount; i++) {
                              String levelName = doc.getString("LEVEL" + i);
                              levelList.add(levelName);
                          }
      
                      }else{
                          Toast.makeText(LevelActivity.this, "no level", Toast.LENGTH_SHORT).show();
                      }
                      adapter.notifyDataSetChanged(); // ?
                  }else{
      
                      Toast.makeText(LevelActivity.this, task.getException().getMessage(), Toast.LENGTH_SHORT).show();
                  }
              });
      

      【讨论】:

        猜你喜欢
        • 2021-10-01
        • 2021-08-25
        • 2020-08-09
        • 2020-06-06
        • 1970-01-01
        • 1970-01-01
        • 2015-02-26
        相关资源
        最近更新 更多