주소록에서 정보를 가져와서 리스트뷰에 뿌려주었는데요. 여기에 검색 기능이 필요해서 얹었습니다.
기왕 검색하는거 초성검색을 구현하고 싶은데요.
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
}
}
어댑터에 이 메소드를 집어넣어서 체크 상태를 강제로 맞춰보려고 했는데, 이것도 실패했습니다 ㅠㅠ
아직 초보인지라 코드를 한번에 이해하는 데에 시간도 오래 걸리고, 많이 부족합니다.
넓은 아량으로 힌트라도 주시면 감사하겠습니다 ㅠㅠ