BLOG main image
분류 전체보기 (74)
Cocos2d (9)
낙서장 (4)
스토리지 (1)
안드로이드 (54)
유용한링크 (1)
모바일게임 (2)
추천앱 (1)
아이폰 (0)
맛집/여행 (1)
ナイトウェアメンズ
ナイトウェアメンズ
割烹着 オシャレ
割烹着 オシャレ
klicken Sie einfach auf die bi..
klicken Sie einfach auf die bi..
スポーツ
スポーツ
サンダル
サンダル
286,105 Visitors up to today!
Today 15 hit, Yesterday 21 hit
daisy rss
tistory 티스토리 가입하기!
2012.09.21 11:01
  

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

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


나그네 | 2012.12.16 21:38 | PERMALINK | EDIT/DEL | REPLY
목록에 다 담아서 비교하면 연락처가 많아지면 죽지 않을까요?
나그네2 | 2014.08.22 20:40 | PERMALINK | EDIT/DEL | REPLY
이 소스 그대로 복+붙 했는데 안돌아가네요 ㅠ_ㅠ
Name
Password
Homepage
Secret