마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

파이어베이스 리스트뷰 롱클릭 삭제

0 추천
파이어베이스고, 리스트뷰에 데이터 롱클릭하면 다이얼로그 뜨고 삭제하는건데 삭제는 잘됩니다

문제는 통째로 삭제됩니다..

 public void onClick(DialogInterface dialogInterface, int i) {
                        EnglishWordApplication.mDatabase.getReference("word"+day).addListenerForSingleValueEvent(
                                new ValueEventListener() {

                                    @Override
                                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                                        //item = dataSnapshot.getValue(EnglishWordItem.class);
                                        for(DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
                                            //    String str = String.valueOf(EnglishWordApplication.mDatabase.getReference("remember").child(postSnapshot.getKey()));
                                            EnglishWordApplication.mDatabase.getReference("word"+day).child(postSnapshot.getKey()).setValue(null);
                                        }
                                    }
                                    @Override
                                    public void onCancelled(@NonNull DatabaseError databaseError) {
                                    }
                                }
                        );

해당 소스부분이고, 어댑터에서 사용중입니다.

이거말고 리스트뷰에 별달아서 즐겨찾기로, 별누르면 불들어오면서 리스트에 추가되고

별 한번 더누르면 불꺼지면서 리스트에 삭제되는것도 위에 소스 포문이랑 setvalue(null)하는 부분이

완전히 똑같거든요.. 근데 얘는 왜 통째로 삭제되는걸까요.. 어떻게 해야 해당 애만 삭제될까요
익명사용자 님이 2019년 8월 7일 질문

3개의 답변

0 추천
올려주신 코드가 잘립니다.
융슈비 (1,280 포인트) 님이 2019년 8월 8일 답변
0 추천
postSnapshot.getKey()가 리스트뷰의 각 아이템에 해당하는 데이터베이스의 키값인듯 한데요, for문 돌면서 모든 키값들을 다 null로 만들어준니 전체 삭제되는 것인듯 해요.

지우려고 하시는 position의 아이템의 키값만 받아와서 지우셔야되요. 전 리사이클러뷰로 한거지만 로직은 크게 다르지 않으니 참고해서 바꿔쓰심될것같아요. 그리고 setValue(null) 보다는 참조위치에서 removeValue()를 쓰시는게 가이드에서 나와있는 방법이니 더 좋지 않을까 싶어요.

holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View view) {
                    // 친구 삭제
                    AlertDialog.Builder builder = new AlertDialog.Builder(context);
                    builder.setTitle("친추 정보 변경");
                    builder.setMessage("친구를 삭제 하시겠습니까?");
                    builder.setPositiveButton("확인",
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int which) {

                                    deleteRef = FirebaseDatabase.getInstance().getReference("AddFriend")
                                            .child(currentUid)
                                            .child(mFriend.get(holder.getAdapterPosition()).getKey());
                                    deleteRef.addListenerForSingleValueEvent(new ValueEventListener() {
                                        @Override
                                        public void onDataChange(DataSnapshot dataSnapshot) {
                                            dataSnapshot.getRef().removeValue();  //내 하위노드의 친구정보 삭제
                                        }

                                        @Override
                                        public void onCancelled(DatabaseError databaseError) {

                                        }
                                    });
                    
                                }
                            });
                    builder.setNegativeButton("취소",
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int which) {

                                }
                            });
                    builder.show();
                    return true;
                }
            });
익명사용자 님이 2019년 8월 8일 답변
0 추천
익명사용자 님이 2019년 8월 8일 답변
...