【问题标题】:Android - Populate recycler view problemsAndroid - 填充回收站视图问题
【发布时间】:2019-04-18 00:01:49
【问题描述】:

当arraylist.day == calendar.dayofmonth 时,我做了一些事情,它以编程方式滚动到arraylist 位置,但是当我开始我的活动时,我遇到了这个错误:“尝试调用虚拟方法'boolean java.lang .String.equals(java.lang.Object)' 在空对象引用上”。

有人可以帮帮我吗?

Planning.java:

    public void setUpRecyclerView(){
    recyclerView = findViewById(R.id.recyclerView);
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
}

private void setUpFirebase(){
    db = FirebaseFirestore.getInstance();
}

private void loadDataFromFirebase(){
    if(eventsArrayList.size()>0){
        eventsArrayList.clear();}
    db.collection("Planning").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
            for(DocumentSnapshot querySnapshot: task.getResult()){
                Events Nom = new Events(querySnapshot.getString("Nom"),querySnapshot.getString("Lieu"),querySnapshot.getString("Heure"),querySnapshot.getString("Minute"),querySnapshot.getString("Day"));
                eventsArrayList.add(Nom);
            }
            tvLoad.setVisibility(View.GONE);
            progressBar.setVisibility(View.GONE);
            adapter = new MyRecyclerViewAdapter(Planning.this, eventsArrayList);
            recyclerView.setAdapter(adapter);
            recyclerView.setItemAnimator(new DefaultItemAnimator());
        }
}

    public void ScrollTo(int position){
    recyclerView.scrollToPosition(position);
}
}

RecyclerViewAdapter:

    @Override
public void onBindViewHolder(@NonNull MyRecyclerViewHolder holder, int position) {
    Calendar cal = Calendar.getInstance();
    holder.tvLieu.setVisibility(View.VISIBLE);
    holder.tvDate.setVisibility(View.VISIBLE);
    holder.cardView.setCardBackgroundColor(Color.WHITE);
    LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) holder.tvNom.getLayoutParams();
    params.gravity = Gravity.START;
    holder.tvNom.setLayoutParams(params);
    if(eventsArrayList.get(position).getDay().equals(String.valueOf(cal.get(Calendar.DAY_OF_MONTH)))) { planning.ScrollTo(position); }
    holder.tvNom.setText(eventsArrayList.get(position).getNom());
    holder.tvLieu.setText(eventsArrayList.get(position).getLieu());
    holder.tvDate.setText(eventsArrayList.get(position).getHeure() + "h" + eventsArrayList.get(position).getMinute());
    if(eventsArrayList.get(position).getHeure().equals("")){
        holder.tvDate.setVisibility(View.GONE);
        holder.tvLieu.setVisibility(View.GONE);
        params.gravity = Gravity.CENTER;
        holder.tvNom.setLayoutParams(params);
        holder.cardView.setCardBackgroundColor(Color.parseColor("#227c97"));
    }
}

【问题讨论】:

    标签: android firebase android-studio android-recyclerview google-cloud-firestore


    【解决方案1】:

    如果没有适当的堆栈跟踪,我只能假设 eventsArrayList.get(position).getHeure()eventsArrayList.get(position).getDay() 已返回 null。

    如果您认为它在 eventsArrayList.get(position).getHeure() 处崩溃,您可以尝试使用 TextUtils.isEmpty,它还会检查 null:

    if(TextUtils.isEmpty(eventsArrayList.get(position).getHeure())){
        holder.tvDate.setVisibility(View.GONE);
        holder.tvLieu.setVisibility(View.GONE);
        params.gravity = Gravity.CENTER;
        holder.tvNom.setLayoutParams(params);
        holder.cardView.setCardBackgroundColor(Color.parseColor("#227c97"));
    } else {
        // also you should update tvDate, tvLieu, tvNom and cardView
        // or you would get weird behaviour when the view holder is being recycled
    }
    

    如果您认为它在eventsArrayList.get(position).getDay() 崩溃,您可以使用TextUtils.equals

    if (TextUtils.equals(eventsArrayList.get(position).getDay(), String.valueOf(cal.get(Calendar.DAY_OF_MONTH)))
    

    最重要的是,我不建议在onBindViewHolder 中使用RecyclerView.scrollTo,这是一种不好的做法,您应该在其他地方执行此操作。可能是因为你试图匹配一个条件,它可以为其他位置返回 null,所以发生了 NPE。

    【讨论】:

    • 谢谢,根据您的回答,我想做的工作,但我需要启动 2 次计划活动,以使 recyclerview 滚动到我想要的位置
    • 我不太确定您“需要开始 2 次计划活动”部分..?如果您说在滚动回收站视图时遇到问题,您可以尝试在设置适配器后立即致电recyclerView.postDelayed(()-&gt;recyclerView.scrollToPosition(desired_position), 300);
    • 我的意思是我需要开始我的活动计划,回到我的主要活动并重新开始我的计划活动以使 ScrollToPosition 工作
    • 您发送的内容不起作用,我不知道如何解决,但感谢您为我所做的一切 =)
    • 哦,也许可以为它创建新问题,看看是否还有其他人可以提供帮助。祝你好运!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    • 2019-08-10
    • 1970-01-01
    相关资源
    最近更新 更多