代码之家  ›  专栏  ›  技术社区  ›  ironmantis7x

由于Firebase引用错误而导致膨胀视图片段时出现空指针异常错误

  •  -1
  • ironmantis7x  · 技术社区  · 7 年前

    我被困在这个问题上。。。。

    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);

    我不完全确定这就是问题所在。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Kubik    7 年前

    // 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)

    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);
    }