초성검색 예제입니다 . SoundSearcher 클래스는 웹에서 퍼왔습니다.
-----------------------------------------------------------------------------------------------------
public class SoundSearch extends ListActivity {
ArrayList<String> searchList = new ArrayList<String>();
ArrayList<String> newSearchList = new ArrayList<String>();
MenuAdapter mAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
addList();//검색리스트를 애드 해준다
EditText searchKey = (EditText)findViewById(R.id.search_keyword);
searchKey.addTextChangedListener(textWatcherInput);//텍스트가 변할때 이벤트
mAdapter = new MenuAdapter(SoundSearch.this, R.layout.search_list, searchList);
setListAdapter(mAdapter);
mAdapter.notifyDataSetChanged();
}
private void addList() {
searchList.add("김씨"); searchList.add("김씨입니다"); searchList.add("정씨");searchList.add("박씨");searchList.add("박씨입니다");searchList.add("박씨요");searchList.add("하씨");
searchList.add("황씨"); searchList.add("퐁퐁"); searchList.add("이씨");searchList.add("배씨");searchList.add("타타타");searchList.add("노씨요");searchList.add("홍씨");
searchList.add("단군"); searchList.add("라라라"); searchList.add("마징가");searchList.add("송송");searchList.add("아자");searchList.add("차요");searchList.add("카메라");
}
TextWatcher textWatcherInput = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if(s.length()==0){//텍스트가 다 지워질때는 전체 목록을 보여준다
mAdapter = new MenuAdapter(SoundSearch.this, R.layout.search_list, searchList);
setListAdapter(mAdapter);
mAdapter.notifyDataSetChanged();
}else{
newSearchList.clear();
for(int i=0; i<searchList.size() ; i++){
String searchData = searchList.get(i).toString();
String keyWord= s.toString();
boolean isData = SoundSearcher.matchString(searchData,keyWord); //검색할 대상 , 검색 키워드로 검색키워드가 검색대상에 있으면 true를 리턴해준다
if(isData){
newSearchList.add(searchData);//검색대상에 있으면 새로운 리스트를 만들어서 이름을 애드해준다
}
}
mAdapter = new MenuAdapter(SoundSearch.this, R.layout.search_list, newSearchList);
setListAdapter(mAdapter);
mAdapter.notifyDataSetChanged();//검색이 끝나면 새로운 리스트로 리스트뷰를 갱신해준다
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
};
public class MenuAdapter extends ArrayAdapter<String> {
private ArrayList<String> items;
String fInfo;
public MenuAdapter(Context context, int textViewResourseId,ArrayList<String> items) {
super(context, textViewResourseId, items);
this.items = items;
}
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.search_list, null);
}
fInfo = items.get(position);
// ((LinearLayout) v.findViewById(R.id.com_rowid)).setOnClickListener(ListViewCLICKed);
((TextView) v.findViewById(R.id.name)).setText(fInfo.toString());
return v;
}
}
}
--------------------------------------------------------------------------------------------------
public class SoundSearcher
{
private static final char HANGUL_BEGIN_UNICODE = 44032; // 가
private static final char HANGUL_LAST_UNICODE = 55203; // 힣
private static final char HANGUL_BASE_UNIT = 588;//각자음 마다 가지는 글자수
//자음
private static final char[] INITIAL_SOUND = { 'ㄱ', 'ㄲ', 'ㄴ', 'ㄷ', 'ㄸ', 'ㄹ', 'ㅁ', 'ㅂ', 'ㅃ', 'ㅅ', 'ㅆ', 'ㅇ', 'ㅈ', 'ㅉ', 'ㅊ', 'ㅋ', 'ㅌ', 'ㅍ', 'ㅎ' };
/**
* 해당 문자가 INITIAL_SOUND인지 검사.
* @param searchar
* @return
*/
private static boolean isInitialSound(char searchar){
for(char c:INITIAL_SOUND){
if(c == searchar){
return true;
}
}
return false;
}
/**
* 해당 문자의 자음을 얻는다.
*
* @param c 검사할 문자
* @return
*/
private static char getInitialSound(char c) {
int hanBegin = (c - HANGUL_BEGIN_UNICODE);
int index = hanBegin / HANGUL_BASE_UNIT;
return INITIAL_SOUND[index];
}
/**
* 해당 문자가 한글인지 검사
* @param c 문자 하나
* @return
*/
private static boolean isHangul(char c) {
return HANGUL_BEGIN_UNICODE <= c && c <= HANGUL_LAST_UNICODE;
}
/**
* 생성자.
*/
public SoundSearcher() { }
/** * 검색을 한다. 초성 검색 완벽 지원함.
* @param value : 검색 대상 ex> 초성검색합니다
* @param search : 검색어 ex> ㅅ검ㅅ합ㄴ
* @return 매칭 되는거 찾으면 true 못찾으면 false. */
public static boolean matchString(String value, String search){
int t = 0;
int seof = value.length() - search.length();
int slen = search.length();
if(seof < 0)
return false; //검색어가 더 길면 false를 리턴한다.
for(int i = 0;i <= seof;i++){
t = 0;
while(t < slen){
if(isInitialSound(search.charAt(t))==true && isHangul(value.charAt(i+t))){
//만약 현재 char이 초성이고 value가 한글이면
if(getInitialSound(value.charAt(i+t))==search.charAt(t))
//각각의 초성끼리 같은지 비교한다
t++;
else
break;
} else {
//char이 초성이 아니라면
if(value.charAt(i+t)==search.charAt(t))
//그냥 같은지 비교한다.
t++;
else
break;
}
}
if(t == slen)
return true; //모두 일치한 결과를 찾으면 true를 리턴한다.
}
return false; //일치하는 것을 찾지 못했으면 false를 리턴한다.
}
}
--------------------------------------------------------------------------------------------------
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:orientation="vertical"
android:layout_height="500dip" >
<EditText
android:id="@+id/search_keyword"
android:layout_width="match_parent"
android:layout_height="50dip" />
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="450dip" >
<ListView
android:id="@+id/android:list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:divider="#cbcbc8"
android:dividerHeight="0.5dip"
android:fadingEdge="none"
android:listSelector="#FFFFFF"
android:scrollingCache="false" />
</LinearLayout>
</LinearLayout>
--------------------------------------------------------------------------------------------------
search_list.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="40dip" >
<TextView
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</RelativeLayout>
--------------------------------------------------------------------------------------------------
'안드로이드' 카테고리의 다른 글
기기별 해상도 (0) | 2012.10.18 |
---|---|
카메라 호출 후 넘어오는 intent.getData()가 null 일때 해결법 (1) | 2012.09.26 |
CallLog(최근전화기록) 삭제 방법 (0) | 2012.09.21 |
WebView 에서 이미지 여백 없이 나오게 하는 방법 (1) | 2012.09.21 |
blob 이미지 insert, select 방법 (0) | 2012.06.14 |