study record

[안드로이드] 리스트뷰 즐겨찾기(찜하기) 기능 구현 본문

안드로이드

[안드로이드] 리스트뷰 즐겨찾기(찜하기) 기능 구현

asong 2021. 2. 28. 16:47

구현한지 조금 지나서 남기게 됐지만 나도 이 기능을 구현하기 위해서 굉장히 많이 구글링하고 고생했기 때문에 꼭 글을 남기려고 한다.

 

내가 구현하고자 했던 기능은 리스트뷰의 각 아이템에서 버튼을 누르면 데이터베이스에 저장이 되고 저장된 아이템들은 다시 돌아왔을 때 눌러진 상태여야 한다는 것이다. 찾아보니 버튼으로 이것을 구현하기 보다는 체크박스로 구현하는 것이 더 편할 것 같아 체크박스로 즐겨찾기(찜하기) 기능을 구현하였다.

 

 public boolean isCheck[] = new boolean[50];

일단 프래그먼트 클래스 상단에 boolean 배열을 선언한다.

 

그리고 Adapter의 getView() 메소드 안에 다음의 코드를 넣었다.

CheckBox favoriteBtn = (CheckBox) v.findViewById(R.id.favorite);

songJjimList = helper.selectSongJjim();

            for (int i = 0; i < songJjimList.size(); i++) {
                for (int j = 0; j < list.size(); j++) {
                    if (songJjimList.get(i).Id.equals(list.get(j).Id)) {
                        isCheck[j] = true;
                    } else if (isCheck[j] == true) {
                        isCheck[j] = true;
                    } else if (isCheck[j] == false && !songJjimList.get(i).Id.equals(list.get(j).Id)){
                        isCheck[j] = false;
                    }
                }
            }

            if (item != null) {
                if (favoriteBtn != null) {
                    favoriteBtn.setChecked(false);
                    CheckBox cbox = (CheckBox)(v.findViewById(R.id.favorite));
                    cbox.setChecked(isCheck[position]);
                    cbox.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            if(isCheck[position]) {
                                isCheck[position] = false;
                                helper.deleteSongJjim(list.get(position).Id);
                                Toast.makeText(getContext(), "찜을 취소했습니다.", Toast.LENGTH_SHORT).show();
                            } else{
                                isCheck[position] = true;
                                helper.insertSongJjim(list.get(position).Id, list.get(position).title, list.get(position).thumbnail);
                                Toast.makeText(getContext(), "노래를 찜했습니다.", Toast.LENGTH_SHORT).show();
                            }
                        }
                    });
                    favoriteBtn.setChecked(isCheck[position]);
                }
            }

리스트뷰 각 아이템 안에 들어가는 체크박스를 찾고,

로컬 DB에 같은 ID가 저장되어있으면 isCheck[] 배열을 true로 바꿔준다. 

isCheck[]에 맞추어 setChecked를 해준다. 해당 프래그먼트에 들어왔을 때 언제라도 DB에 저장되어 있으면 체크표시를 해주는 것이다.

체크박스를 클릭하면 isCheck[]를 잘 설정해주고, DB에 저장한다.

setChecked()해주면 완료!

//같은 체크박스를 두 번 설정하는 것은 나도 이유를 모르겠다,,,

이렇게 하면 로컬 DB에 맞추어 저장되어 있으면 리스트뷰의 체크박스가 체크된 채로 그때그때 잘 보인다.

 

 

전체 작성 코드 (참고만 하시면 좋을 듯 합니다)

https://github.com/JNU-econovation/the-last-king-of-TROT/blob/main/TrotWithTabs/app/src/main/java/com/trot/trotwithtabs/Jjim.java