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: }
댓글 없음:
댓글 쓰기