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

초성검색과 리스트뷰, CHOICE_MODE_MULTIPLE... 이 상황에서 체크 상태 유지가 안되네요..

+1 추천

주소록에서 정보를 가져와서 리스트뷰에 뿌려주었는데요. 여기에 검색 기능이 필요해서 얹었습니다.

기왕 검색하는거 초성검색을 구현하고 싶은데요.

CHOICE_MODE_SINGLE의 경우 그냥 리스트 어댑터를 교체하는 식으로 하여 잘 구동되는 것을 확인했습니다.

다만, CHOICE_MODE_MULTIPLE에서 체크박스의 상태가 초기화 되는 문제가 있더군요.

검색을 해 본 결과, notifyDataSetChanged()를 이용해서 구현시키라는 내용을 보았는데, 아직 제가 초보자인지라 어떻게 해야 할 지 감이 잡히질 않습니다 ㅠㅠ

고수분들의 도움이 절실하네요 ㅠㅠ

체크박스의 경우 다른 기능이 필요 없기 때문에 아이템 클릭 시에 체크 상태를 변경하도록 했습니다.

adapter = new ContactsAdapter2(getActivity(), R.layout.list_contact_multiple, getContactList(), selList);
        lv_contact_multiple.setAdapter(adapter);

그냥 주소록에서 가져온 정보를 어댑터에 연결한 부분이구요..

lv_contact_multiple.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> contactlist, View v, int position, long resid) {
                chkbox_contact_multiple = (CheckBox)v.findViewById(R.id.chkbox_contact_multiple);

                Contact item1 = (Contact) lv_contact_multiple.getItemAtPosition(position);
                name = item1.getName();
                recid = (int)item1.getPhotoid();

                GroupModList sel = new GroupModList(recid, name, 0);

                if (chkbox_contact_multiple.isChecked()) {
                    chkbox_contact_multiple.setChecked(false);
                    for (int i = 0;i<selList.size();i++) {
                        GroupModList ii = selList.get(i);
                        int tmpiirec = ii.getModableRecid();
                        if (tmpiirec == recid) {
                            selList.remove(ii);
                        }
                    }
                } else {
                    chkbox_contact_multiple.setChecked(true);

                    selList.add(sel);
                }
                ReloadSelection();
                Reload();
            }
        });

리스트 아이템을 클릭했을 때 체크박스 변경과, 선택된 아이템을 GroupModList라는 클래스에 저장시키거나 삭제하는 구문입니다.

group_contact_search = (EditText)view.findViewById(R.id.group_contact_search);
        group_contact_search.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                ArrayList<Contact> acontactlist = new ArrayList<Contact>();
                for (int i = 0; i < adapter.getCount();i++) {
                    Contact contact = contactlist.get(i);
                    String tmpName = contact.getName();
                    String searchKeyword = s.toString();
                    Boolean bool = SoundSearcher.matchString(tmpName, searchKeyword);
                    if (bool) {
                        acontactlist.add(contact);
                    }
                }
                adapter.notifyDataSetChanged();
                ContactsAdapter2 adapter1 = new ContactsAdapter2(getActivity(), R.layout.list_contact_multiple, acontactlist, null);
                lv_contact_multiple.setAdapter(adapter1);
            }

이렇게 어댑터를 변경하는 방법으로 구현했더니 체크박스 체크 상태가 저장되지 않았습니다.

if (selList != null) {
                for (int i=0;i<selList.size();i++) {
                    GroupModList ii = selList.get(i);
                    int tmprec = ii.getModableRecid();
                    if (recid == tmprec) {
                        holder.contact_multiple_chk.setChecked(true);
                    } else {
                        holder.contact_multiple_chk.setChecked(false);
                    }
                    Toast.makeText(context, "tmprec = " + String.valueOf(tmprec) + ", recid = " + String.valueOf(recid), Toast.LENGTH_SHORT).s
                }
            }

어댑터에 이 메소드를 집어넣어서 체크 상태를 강제로 맞춰보려고 했는데, 이것도 실패했습니다 ㅠㅠ

 

아직 초보인지라 코드를 한번에 이해하는 데에 시간도 오래 걸리고, 많이 부족합니다.

넓은 아량으로 힌트라도 주시면 감사하겠습니다 ㅠㅠ

너만의그녀 (590 포인트) 님이 2014년 7월 17일 질문

1개의 답변

0 추천
일단 체크박스객체.setChecked[booleanList]; 요고 한줄 getVIew에 들어가고,

해당 아답터에 인터페이스 구현하시고 인터페이스 getter setter 만드시고

인터페이스 내 콜백 추상메서드를 생성하시고

getVIew내에 체크박스 온채크채인지드 리스너에 온체크 체인지드 오버라이드 메소드에서

isCheck드를 적당히 불리형배열에다 담으셔서 콜백 메서드 파라미터로 넘깁니다.

다음 해당 아답터 호출하는 클래스에서 해당 인터페이스 implement 하시고

콜백 메서드 오버라이드 받으시고 그 안에서 ui에서 동작하실꺼 코딩하시고

setAdapter 하기전에 setter 호출해서 파라미터 마춰주시면 끝.
쭈쭈총각 (17,750 포인트) 님이 2014년 7월 30일 답변
...