Ошибка исключения нулевого указателя, раздувающая фрагмент просмотра из-за ошибки ссылки Firebase - PullRequest
0 голосов
/ 27 октября 2018

Я застрял в этой проблеме ....

Я продолжаю получать эту конкретную ошибку в своем приложении:

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 Ответ

0 голосов
/ 27 октября 2018

Вы закомментировали инициализацию mReference:

// private DatabaseReference mReference = FirebaseDatabase.getInstance().getReference() // .child(getString(R.string.node_watch_list)) // .child(FirebaseAuth.getInstance().getCurrentUser().getUid());

и вместо этого инициализируйте его нулем:

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...