android - Android - 填充回收站视图问题
问题描述
当arraylist.day == calendar.dayofmonth时,我做了一些事情,它以编程方式滚动到arraylist位置,但是当我开始我的活动时,我遇到了这个错误:“尝试调用虚拟方法'boolean java.lang.String。在空对象引用上等于(java.lang.Object)'。
有人能帮助我吗 ?
规划.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);
}
}
回收器视图适配器:
@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"));
}
}
解决方案
如果没有适当的堆栈跟踪,我只能假设或者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)))
最重要的是,我不推荐RecyclerView.scrollTo
in onBindViewHolder
,这是一种不好的做法,您应该在其他地方执行此操作。也许是因为你试图匹配一个条件,它可以为其他位置返回 null,所以发生了 NPE。
推荐阅读
- php - 如何根据 PHP 中的键清除具有半重复值的数组数组?
- python - 如何在通过 Selenium 和 Python 调用 get() 方法时捕获网络故障?
- vba - Range.Value 不起作用
- asp.net - override IIS windows auth with basic auth in asp.net
- jquery - 获取所选项目的文本并将它们放入列表中
- elasticsearch - Kafka连接弹性搜索ID创建多个字段不起作用
- java - AVRO 原始类型的 Serde 类
- sql - SQL-正则表达式检查字段是否有字母数字字符
- ruby - 我可以使用 '&' 简写来选择匹配项吗?
- sql-server - 有没有办法可以使用计算表达式作为 SSRS 中的参数?