본문 바로가기

안드로이드

TextWatcher에서 초성검색하기

초성검색 예제입니다 .  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>

--------------------------------------------------------------------------------------------------