android - 由于 Firebase 引用错误,导致视图片段膨胀的空指针异常错误
问题描述
我被这个问题困住了......
我在我的应用程序中不断收到此特定错误:
java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.firebase.database.ValueEventListener com.google.firebase.database.DatabaseReference.addValueEventListener(com.google.firebase.database.ValueEventListener)' on a null object reference
现在,我要做的是发布 Firebase 数据库中列出的项目的结果。
这是我制作该列表的代码:
public class WatchListFragment extends Fragment {
private static final String TAG = "WatchListFragment";
private static final int NUM_GRID_COLUMNS = 3;
private static final int GRID_ITEM_MARGIN = 5;
//widgets
private FrameLayout mFrameLayout;
//reference for listening when items are added or removed from the watch list
//vars
// private DatabaseReference mReference = FirebaseDatabase.getInstance().getReference()
// .child(getString(R.string.node_watch_list))
// .child(FirebaseAuth.getInstance().getCurrentUser().getUid());
private PostAdapter mAdapter;
private ArrayList<Post> mPosts;
private RecyclerView mRecyclerView;
private DatabaseReference mReference;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_watch_list, container, true);
mRecyclerView = (RecyclerView) view.findViewById(R.id.watchListRecyclerView);
mFrameLayout = (FrameLayout) view.findViewById(R.id.watch_list_container);
Log.d(TAG, "init: initializing.");
mPosts = new ArrayList<>();
//set the listener to the reference
mReference.addValueEventListener(mLisenter);
if(isAdded()){
getResources().getString(R.string.app_name);
mReference = FirebaseDatabase.getInstance().getReference()
.child(getString(R.string.node_watch_list))
.child(FirebaseAuth.getInstance().getCurrentUser().getUid());
}
mPosts = new ArrayList<Post>();
mAdapter = new PostAdapter(this, mPosts);
mRecyclerView = (RecyclerView) view.findViewById(R.id.watchListRecyclerView); //unsere (Recycleriew)Liste aus dem Design wird in eine RecyclerView ungewandelt
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); //Hier könnten wir auch verschiedene Layouts festlegen. Bei der ListView, die vorher hatten, ist das Linearlayout fest eingestellt.
mRecyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), LinearLayoutManager.VERTICAL)); // Der Divider trennt die Zeilen mit einem Strich
mRecyclerView.setAdapter(mAdapter); //Adapter wird gesetzt
// RecyclerViewMargin itemDecorator = new RecyclerViewMargin(GRID_ITEM_MARGIN, NUM_GRID_COLUMNS);
// mRecyclerView.addItemDecoration(itemDecorator);
// GridLayoutManager gridLayoutManager = new GridLayoutManager(getActivity(), NUM_GRID_COLUMNS);
// mRecyclerView.setLayoutManager(gridLayoutManager);
// mAdapter = new PostListAdapter(getActivity(), mPosts);
// mRecyclerView.setAdapter(mAdapter);
return view;
}
public void viewPost(String postId){
ViewPostFragment fragment = new ViewPostFragment();
Activity activity = getActivity();
if (isAdded() && activity != null) {
FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
Bundle args = new Bundle();
args.putString(getString(R.string.arg_post_id), postId);
fragment.setArguments(args);
transaction.replace(R.id.watch_list_container, fragment, getString(R.string.fragment_view_post));
transaction.addToBackStack(getString(R.string.fragment_view_post));
transaction.commit();
mFrameLayout.setVisibility(View.VISIBLE);
}
}
@Override
public void onDestroy() {
super.onDestroy();
mReference.removeEventListener(mLisenter);
}
ValueEventListener mLisenter = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Log.d(TAG, "onDataChange: a change was made to this users watch lits node.");
DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
Query query = reference.child("posts")
.orderByKey()
.equalTo(FirebaseAuth.getInstance().getCurrentUser().getUid());
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
DataSnapshot dShot = dataSnapshot.getChildren().iterator().next();
for (DataSnapshot dShot2 : dShot.getChildren()) {
Post post = (Post) dShot2.getValue(Post.class);
mPosts.add(post);
}
mAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
};
}
logcat 中标记的违规代码行是:mReference.addValueEventListener(mLisenter);
我不完全确定这就是问题所在。我已经按照教程并在谷歌上搜索了答案,但我仍然不知道为什么会遇到这个特定问题
解决方案
您已注释掉 mReference 的初始化:
// private DatabaseReference mReference = FirebaseDatabase.getInstance().getReference()
// .child(getString(R.string.node_watch_list))
// .child(FirebaseAuth.getInstance().getCurrentUser().getUid());
而是将其初始化为null:
private DatabaseReference mReference;
和private DatabaseReference mReference = null;
稍后在您的 onCreateView 中,您尝试将侦听器添加到此空引用:
mReference.addValueEventListener(mLisenter);
和null.addValueEventListener(mLisenter)
编辑:现在我看到,您稍后在代码中初始化 mReference,试试这个:
if(isAdded()){
getResources().getString(R.string.app_name);
mReference = FirebaseDatabase.getInstance().getReference()
.child(getString(R.string.node_watch_list))
.child(FirebaseAuth.getInstance().getCurrentUser().getUid());
//move add listener here
mReference.addValueEventListener(mLisenter);
}
推荐阅读
- c# - C# Linq - 选择多个字段,其中一个字段也应使用选择进行过滤
- javascript - 数组项上的 ReferenceError
- mysql - 带有子查询的 SQL WHERE 条件为空
- android - 如何使 Listview 项目视图在LongPress 上可见
- azure - 是否需要对 Azure Application Insights 进行补充日志记录?
- spring - 为什么 SimpleJmsListenerContainerFactory 不提供并发配置?
- c# - XpsDocument.GetFixedDocumentSequence() 内存泄漏
- python - Odoo:如何在 odoo 中找到单个用户的所有会话
- laravel - Laravel,Vue组件模板不显示?
- php - 访问json响应(数组)中的元素