mos
52
2021-04-18 02:37:08
2
126

안드로이드 java.lang.NullPointerException 에러 해결하고 싶어요..


각 게시글에 댓글 기능을 넣으려고 합니다.

그래서 ArrayList<String> contentIdList 를 만들어서 document.getId() 를 저장하려고 했습니다.

게시글 문서의 각 id를 받아서 문서 내에 collection을 만들고 댓글을 넣기 위해서 입니다.

이렇게 하면 게시글 안에 댓글이 들어가서 엉뚱한 게시글에 댓글이 나올 일이 없기 때문입니다.


Q.

그런데 contentIdList 가 자꾸 null 값을 가져서 문제입니다.

분명 앞에 clear로 생성하거나 new ArrayList<>(); 로 생성자를 지정해줘도 계속 null 값을 가져요..

정말 답이 안 보입니다


밑에 코드 첨부하겠습니다. 에러 발생 지점에 // 로 표시해놓았습니다

public class CertificationAdapter extends RecyclerView.Adapter<CertificationAdapter.CertifyViewHolder> {
    private final ArrayList<CertificationBoard> certificationBoards;
    private final Activity activity;
    private ArrayList<String> contentIdList;
    FirebaseFirestore firebaseFirestore;
    DocumentReference documentReference;

    public static class CertifyViewHolder extends RecyclerView.ViewHolder {
        public CardView cardView;

        public CertifyViewHolder(CardView v) {
            super(v);
            cardView = v;
        }
    }

    public CertificationAdapter(Activity activity, ArrayList<CertificationBoard> certificationBoards, ArrayList<String> contentIdList) {
        this.certificationBoards = certificationBoards;
        this.contentIdList = contentIdList;
        this.activity = activity;
        // 유저 list 도 지정

        firebaseFirestore = FirebaseFirestore.getInstance();
        // 파이어스토어에서 글 가져오기
        firebaseFirestore.collection("certification")
                .orderBy("boardCreate")
                .get()
                .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                    @SuppressLint("LongLogTag")
                    @Override
                    public void onComplete(@NonNull Task<QuerySnapshot> task) {
                        if (task.isSuccessful()) {
                            certificationBoards.clear();
                            contentIdList.clear();
                            for (QueryDocumentSnapshot document : Objects.requireNonNull(task.getResult())) {
                                Log.d(TAG, document.getId() + "=> " + document.getData());
                                certificationBoards.add(new CertificationBoard(
                                        document.getData().get("boardTitle").toString(),
                                        document.getData().get("boardContent").toString(),
                                        document.getData().get("name").toString(),
                                        (Long) document.getData().get("boardCreate"),
                                        document.getData().get("certifyPhoto").toString()
                                ));
                                // 에러 발생: java.lang.NullPointerException: Attempt to invoke virtual method
                                // 'java.lang.String com.google.firebase.firestore.DocumentReference.getId()' on a null object reference
                                contentIdList.add(documentReference.getId());
                            }
                        } else {
                            Log.d(TAG, "error getting documents", task.getException());
                        }
                        notifyDataSetChanged();
                    }
                });

    }

    @NonNull
    @Override
    public CertificationAdapter.CertifyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        CardView cardView = (CardView) LayoutInflater.from(parent.getContext()).inflate(R.layout.item_board_certification, parent, false);

        return new CertifyViewHolder(cardView);
    }

    @Override
    public void onBindViewHolder(@NonNull final CertifyViewHolder holder, int position) {
        // position: 해당 글 인덱스
        CardView cardView = holder.cardView;

        // 인증글 보기로 이동
        cardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(activity, "인증글 보기로 이동", Toast.LENGTH_SHORT).show();

                Intent intent = new Intent(activity, CertificationActivity.class);
                intent.putExtra("certificationBoard", (Serializable) certificationBoards.get(position));
                Log.d("ArrayList", "contentIdList size = " + contentIdList.isEmpty());
                intent.putExtra("contentId", contentIdList.get(position));
                activity.startActivity(intent);
            }
        });

        // 제목
        TextView certifyitem_title = (TextView) cardView.findViewById(R.id.certifyitem_title);
        certifyitem_title.setText(certificationBoards.get(position).getBoardTitle());

        // 작성일
        TextView certifyitem_created = cardView.findViewById(R.id.certifyitem_created);
        SimpleDateFormat timeFormat = new SimpleDateFormat("yyyy-MM-dd");
        String created = timeFormat.format(new Date(certificationBoards.get(position).getBoardCreate()));
        certifyitem_created.setText(created);

        // 작성자
        TextView certifyitem_user = cardView.findViewById(R.id.certifyitem_user);
        certifyitem_user.setText(certificationBoards.get(position).getName());

        // Image
        Glide.with(cardView.getContext()).load(certificationBoards.get(position).getCertifyPhoto()).into(
                (ImageView) cardView.findViewById(R.id.certifyitem_imageview_content)
        );

        // 내용
        TextView certifyitem_content_textview = cardView.findViewById(R.id.certifyitem_content_textview);
        certifyitem_content_textview.setText(certificationBoards.get(position).getBoardContent());

        // 좋아요 수
        TextView certifyitem_favorite_count = cardView.findViewById(R.id.certifyitem_favorite_count);
        certifyitem_favorite_count.setText(String.valueOf(certificationBoards.get(position).getCertifyFeel()));

        // 좋아요 이미지를 누르면 좋아요 수 증가
        cardView.findViewById(R.id.certifyitem_favorite_imageview).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(activity, "좋아요 수 증가", Toast.LENGTH_SHORT).show();
                Log.d("CertificationBoard", "getItemCount = "+ getItemCount());
//                Log.d("Recyclerview", "position = "+ certifyViewHolder.getAdapterPosition());
            }
        });
    }

    @Override
    public int getItemCount() {
        return certificationBoards.size();
    }
}

주석에 있는 에러가 왜 계속 발생하는지 모르겠습니다..



밑에 코드는 혹시 필요하실까봐 첨부합니다.

public class NavigationCertifyFragment extends Fragment implements View.OnClickListener {
    private static final String TAG = "NavigationCertifyFragment";

    RecyclerView recyclerview;
    FloatingActionButton rank_button;
    FloatingActionButton write_certification_button;
    FloatingActionButton comment;

    RecyclerView.LayoutManager layoutManager;
//    FirebaseAuth firebaseAuth;
    FirebaseFirestore firebaseFirestore = null;
//    String userId = null; // user_id

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_bottom_main_certify, container, false);
        firebaseFirestore = FirebaseFirestore.getInstance();
//        userId = firebaseAuth.getCurrentUser().getEmail();
        final ArrayList<CertificationBoard> certificationBoards = new ArrayList<>();
        final ArrayList<String> contentIdList = new ArrayList<>();


        // 랭킹페이지로 가는 버튼
        rank_button = rootView.findViewById(R.id.rank_button);
        rank_button.setOnClickListener(this);

        CertificationAdapter certificationAdapter = new CertificationAdapter(getActivity(), certificationBoards, contentIdList);
        recyclerview = rootView.findViewById(R.id.certifyitemfragment_recyclerview);
        recyclerview.setHasFixedSize(true);
        recyclerview.setAdapter(certificationAdapter);
        layoutManager = new LinearLayoutManager(getActivity());
        recyclerview.setLayoutManager(layoutManager);

        // 댓글 페이지로 가는 버튼
        comment = rootView.findViewById(R.id.comment);
        comment.setOnClickListener(this);

        // 글 작성 페이지로 가는 버튼
        write_certification_button = rootView.findViewById(R.id.write_certification_button);
        write_certification_button.setOnClickListener(this);

        return rootView;
    }

    /* 버튼 이벤트
    * 랭킹
    * 인증글 작성
    * 댓글
    * */
    @Override
    public void onClick(View v) {
        FloatingActionButton button = (FloatingActionButton) v;

        switch (button.getId()) {
            case R.id.rank_button:
                //버튼 클릭시 아래 구현이 실행된다.
                Toast.makeText(getContext(), "랭킹 버튼 클릭", Toast.LENGTH_SHORT).show();
//                getActivity().startActivity(new Intent(getActivity(), Ranking.class));
                break;
            case R.id.write_certification_button:
                Toast.makeText(getContext(), "인증글 작성 버튼 클릭", Toast.LENGTH_SHORT).show();
                // 갤러리 권한
                if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
                    Toast.makeText(getContext(), "권한 허용됨", Toast.LENGTH_SHORT).show();
                    Intent intent = new Intent(getActivity(), AddCertificationActivity.class);
                    startActivity(intent);
                } else {
                    // 허용 요청
                    ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
                    Toast.makeText(getContext(), "권한을 허용해야 합니다.", Toast.LENGTH_SHORT).show();
                }
                break;
            case R.id.comment:
                Toast.makeText(getActivity(), "댓글 버튼 클릭", Toast.LENGTH_SHORT).show();
                Intent intent = new Intent(getActivity(), CommentActivity.class);
//                intent.putExtra("contentId", contentId);
                startActivity(intent);
        }
    }
}


0
  • 답변 2

  • cathei
    314
    2021-04-18 03:49:20

    contentIdList 가 아니라 documentReference 가 null 인데요

  • mos
    52
    2021-04-18 10:07:06

    아 제가 arraylist에 사로잡혀서 그걸 깨닫지 못했군요..ㅠ 감사합니다! 해결했어요!

  • 로그인을 하시면 답변을 등록할 수 있습니다.