반응형
특정 데이터의 문자를 검색해서 띄워주는 기능.
카톡의 채팅창이나 사람 찾는 거 생각하면 된다.
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();
}
반응형
댓글