Android加载Firebase图片到RecyclerView报null object reference错误如何解决
问题根因
抛出空指针异常的核心原因是NewsActivity中存在重复声明的RecyclerView变量:
- 你同时定义了两个RecyclerView实例:
RecyclerView recyclerView;和private RecyclerView mRecyclerView; onCreate方法中仅给recyclerView做了findViewById视图绑定,数据回调里调用setAdapter时用的是从未初始化的mRecyclerView,因此触发空指针。
修复方案
二选一即可:
方式1:删除冗余变量,统一用recyclerView
修改后的NewsActivity代码:
public class NewsActivity extends AppCompatActivity { FirebaseDatabase mDatabase; DatabaseReference mRef; FirebaseStorage mStorage; RecyclerView recyclerView; List<Post> postList; // 删掉多余的private RecyclerView mRecyclerView;声明 private ImageAdapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_news); getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); getSupportActionBar().setCustomView(R.layout.action_bar); mDatabase = FirebaseDatabase.getInstance(); mRef = FirebaseDatabase.getInstance().getReference("Posts"); mStorage = FirebaseStorage.getInstance(); recyclerView = findViewById(R.id.recycler_news); recyclerView.setHasFixedSize(true); recyclerView.setLayoutManager(new LinearLayoutManager(this)); postList = new ArrayList<>(); mRef.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { // 新增清空逻辑,避免多次触发监听导致数据重复 postList.clear(); for (DataSnapshot postSnapshot : snapshot.getChildren()){ Post post = postSnapshot.getValue(Post.class); postList.add(post); } mAdapter = new ImageAdapter(NewsActivity.this, postList); // 改为调用已经初始化的recyclerView recyclerView.setAdapter(mAdapter); } @Override public void onCancelled(@NonNull DatabaseError error) { } }); } }
方式2:统一变量名为mRecyclerView
将findViewById绑定的变量改为mRecyclerView,后续调用保持不变即可。
额外优化建议
可以提前在onCreate中初始化Adapter并绑定到RecyclerView,后续数据变更时仅调用mAdapter.notifyDataSetChanged()刷新列表即可,无需每次回调都新建Adapter实例,性能更优。
内容的提问来源于stack exchange,提问作者Matěj Valášek
相关产品推荐
相关产品推荐

