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

검색 창에 검색이 잘안되네요

0 추천

제가 리스트를 만들고 위에 검색 에딧 텍스트를 만들었습니다.

그런데 이름을 검색하면 괄호안에 있는 것은 검색이 안되구 이름 사이에 적혀있는 글자도 검색이 안됩니다.

어떻게 된걸까요?

 

edit = (EditText)findViewById(R.id.editTextselect);

edit = (EditText) findViewById(R.id.editTextselect);
edit.setInputType(0);
edit.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        edit.setInputType(1);
        InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        mgr.showSoftInput(edit, InputMethodManager.SHOW_IMPLICIT);
    }
});

// 검색 이벤트
edit.addTextChangedListener(new TextWatcher() {
    public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
    }

    public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
    }

    public void afterTextChanged(Editable arg0) {
        MainActivity.this.adapter.getFilter().filter(arg0);
    }
});
iks1681 (280 포인트) 님이 2016년 10월 13일 질문
해당 소스가 없으니 뭐라 말씀드리기 힘들지만 adapter를 확인해 보셔야 겠네요.
items = new ArrayList<String>();

        items.add("abc");
        items.add("123");
        items.add("가나다");

        adapter = new ArrayAdapter<String>(this, R.layout.list_item, items);
        ListView lv = (ListView) findViewById(R.id.lv_data);
        lv.setAdapter(adapter);

        lv.setOnItemClickListener(new ListViewItemClickListener());
        lv.setOnItemLongClickListener(new ListViewItemLongClickListener());

    }

어댑터 부분이라면 이 부분이거든요?
어느 부분이 문제인가요?

2개의 답변

0 추천

아래처럼 리스트뷰 갱신하는 메소드를 추가해 보시죠.

 public void afterTextChanged(Editable arg0) {       
        MainActivitythis.adapter.getFilter().filter(arg0);
        MainActivity.this.adapter.notifyDataSetChanged();
   }

 

spark (227,830 포인트) 님이 2016년 10월 14일 답변
추가 시켜봤는데도 abc 검색할려고 b를 입력하면 안돼요.
0 추천

그렇다면, 아마도 어댑터의 구현이 문제가 되지 않을까 생각되네요. 아래처럼 구현이 되었는지 궁금합니다.

public class CountryAdapter extends BaseAdapter implements Filterable {

    List<String> orginalItems, filteredItems;
    CountryFilter filter;

    public int getCount() {
        return filteredItems.size();
    }

    public String getItem(int position) {
        return filteredItems.get(position);
    }


    @Override
    public View getView(int position, View convertView, ViewGroup parent){
        //your logic
    }

    @Override
    public Filter getFilter() {
        if (filter == null)
            filter = new CountryFilter();
        return filter;
    }

    private class CountryFilter extends Filter {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults results = new FilterResults();
            //your comparison logic
            return results;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            
                filteredItems = (List<String>) results.values;
                notifyDataSetChanged();
        }
    }
}

Filterable 인터페이스를 구현하셔서 Adapter의 getFilter()메소드에서 커스텀 필터를 넘겨주세요. 그리고 어댑터에서는 필터된 데이터를 가지고 화면에 보여주어야 하기 때문에 원본 데이터셑, 필터된 후의 데이터 셑이 다 필요합니다.

spark (227,830 포인트) 님이 2016년 10월 16일 답변
아뇨.
그냥 평범한 리스트에요 그렇게 복잡하게 만들어두진 않았어요
리스트뷰에 필터기능을 사용하시려면 Filterable 인터페이스를 구현하셔야 합니다.
...