본문 바로가기
Android

문자열 검색 기능

by 루에 2015. 6. 25.
반응형

특정 데이터의 문자를 검색해서 띄워주는 기능.


카톡의 채팅창이나 사람 찾는 거 생각하면 된다.


private void setTextChangedListener(EditText view) {  // 검색어를 수정할 때 받을 이벤트 리스너
        view.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                Log.d(TAG, "beforeTextChanged");
            }

            @Override
            public void afterTextChanged(Editable s) {
                Log.d(TAG, "afterTextChanged");
                String key = s.toString();
                if(null == key){
                    refreshAdapterWithNewData(allInfos);
                }
                else{
                    refreshAdapterWithNewData(placeinfosWithKeyWord(key));
                }
            }
            // 여기에 넣으면 안된다. 왜냐하면, count가 변화된 문자 수를 체크하기 때문에 원하는 결과를 얻지 못한다.
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                Log.d(TAG, "onTextChanged");
            }
        });
    }
    // 검색어에 맞는 데이터를 찾아서 리턴
    private List placeinfosWithKeyWord(String keyword){
        List ret = new ArrayList<>();

        for(PlaceInfo p : allInfos){
            if(isMatchingKeyword(keyword, p)){
                ret.add(p);
            }
        }
        return ret;
    }
    // 검색어에 맞는 문자열이 있는지 체크. 내용이야 비교할 데이터에 따라 다르겠지만, 중요한건 String.contains()는 비교할 검색어가 앞으로, 검색어가 파라미터로 가야한다.
    private boolean isMatchingKeyword(String key, PlaceInfo p){
        boolean ret = false;
        if(null != p.getLocalRegionRsrcId()){
            ret = p.getLocalRegionRsrcId().contains(key);
        }
        if(!ret && null != p.getRsrcId()){
            ret = p.getRsrcId().contains(key);
        }
        if(!ret && null != p.getLocalRsrcId()){
            ret = p.getLocalRsrcId().contains(key);
        }
        if(!ret && null != p.getLocalRegionRsrcId()){
            ret = p.getLocalRegionRsrcId().contains(key);
        }
        return ret;
    }
    // 리스너가 호출될 때마다 같이 호출해서 다시 불러온다
    private void refreshAdapterWithNewData(List list){
        mPlaceAdapter.setPlaceList(list);
        mPlaceAdapter.notifyDataSetChanged();
    }


반응형

댓글