2013년 6월 13일 목요일

[Android] Dynamic Search ListView

< EditText과 Filter를 이용한 Search >

EditText의 addTextChangedListener를 통해서 EditText에 입력되는 값을 실시간으로 처리해줄수 있게 된다.

1:  et_search_word.addTextChangedListener(new TextWatcher() {  
2:        @Override  
3:        public void onTextChanged(CharSequence s, int start, int before, int count) {  
4:             _listAdapter.getFilter().filter(s);  
5:        }  
6:        @Override  
7:        public void beforeTextChanged(CharSequence s, int start, int count, int after) {  
8:             // TODO Auto-generated method stub  
9:        }  
10:        @Override  
11:        public void afterTextChanged(Editable s) {  
12:             // TODO Auto-generated method stub  
13:        }  
14:  });  

onTextChanged를 통해서 입력되는 값에 대해서 실시간으로 처리해준다.

ListView를 구성하는 Adapter에 implements Filterable 를 통해서 Filtering을 할 수 있게 된다.

Adapter 내에
1:  @Override  
2:  public Filter getFilter() {  
3:     if (valueFilter == null) {  
4:          valueFilter = new ValueFilter();  
5:     }  
6:     return valueFilter;  
7:  }  

구현해주고
Filter에 해당하는 class를 구현해서 적용하면 끝.

1:  class ValueFilter extends Filter {  
2:    @Override  
3:    protected FilterResults performFiltering (CharSequence constraint) {  
4:         FilterResults results = new FilterResults();  
5:         if(constraint != null && constraint.length() > 0) {  
6:              List<ItemContainer> filterList = new ArrayList<ChatFriendFragment.ItemContainer>();  
7:         for (RosterContact contact : _contacts) {  
8:              if (contact.getName().contains(constraint) || contact.getPhoneNumber().contains(constraint)) {  
9:                   ItemContainer item = new ItemContainer();  
10:                   item.Type = ItemContainer.TYPE_ITEM;  
11:                   item.Item = contact;  
12:                   filterList.add(item);  
13:              }  
14:         }  
15:         results.count = filterList.size();  
16:         results.values = filterList;  
17:         } else {  
18:              setupListItems();  
19:              results.count = _itemList.size();  
20:              results.values = _itemList;  
21:         }  
22:         return results;  
23:    }  
24:    @Override  
25:    protected void publishResults(CharSequence constraint, FilterResults results) {  
26:         _itemList = (List<ItemContainer>) results.values;  
27:         _listAdapter.notifyDataSetChanged();  
28:    }  
29:  }  

댓글 없음:

댓글 쓰기