BETA

【Android】AutoCompleteTextViewでよみがな入力で候補を表示させる

投稿日:2020-05-10
最終更新:2020-05-10

したいこと

漢字やカタカナが候補のときに、 ひらがなで入力したときにも候補が表示されるようにしたい。
(ポケモンの名前をひらがなで入力したときも表示させたい
→「ぴか」と入力したら「ピカチュウ」と候補が表示される)

やり方

単語とよみがななどを扱うデータクラスを作成する。

    data class PokemonList(      
            val katakana:String  
            ,val hiragana:String  
    )  

独自のAdapterを実装する

    class CustomPokeNmLIst(context: Context, @LayoutRes private val layoutResource: Int, private val allPoke: List<PokemonList>):      
        ArrayAdapter<PokemonList>(context, layoutResource, allPoke),  
        Filterable {  
        private var mPoke: List<PokemonList> = allPoke  

        override fun getCount(): Int {  
            return mPoke.size  
        }  

        override fun getItem(p0: Int): PokemonList {  
            return mPoke.get(p0)  
        }  

        override fun getItemId(p0: Int): Long {  
            // Or just return p0  
            return p0.toLong()  
        }  

        override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {  
            val view: TextView = convertView as TextView? ?: LayoutInflater.from(context).inflate(layoutResource, parent, false) as TextView  
            view.text = "${mPoke[position].katakana}"  
            return view  
        }  

        override fun getFilter(): Filter {  
            return object : Filter() {  
                override fun publishResults(charSequence: CharSequence?, filterResults: Filter.FilterResults) {  
                    mPoke = filterResults.values as List<PokemonList>  
                    notifyDataSetChanged()      
                }  

                override fun performFiltering(charSequence: CharSequence?): Filter.FilterResults {  
                    val queryString = charSequence?.toString()?.toLowerCase()  
                        val filterResults = Filter.FilterResults()  
                    filterResults.values = if (queryString==null || queryString.isEmpty())  
                        allPoke  
                    else  
                        allPoke.filter {  
                                 it.hiragana.toLowerCase().contains(queryString)    //ひらがなで入力したときのフィルタリング  
                             ||  it.katakana.toLowerCase().contains(queryString)    //カタカナで入力したときのフィルタリング  
                        }  
                    return filterResults  
                }  

                override fun convertResultToString(resultValue: Any): CharSequence? {  
                    return (resultValue as PokemonList).katakana  
                }  
            }  
        }  
    }  

作成したAdapterを以下のように呼び出す

   //実際はDBから一覧を取得  
   val pokemonNmList = listOf(  
         PokemonList("ピカチュウ","ぴかちゅう" )  
        ,PokemonList("ゼニガメ","ぜにがめ" )  
        ,PokemonList("ヒトカゲ","ひとかげ" )  
        ,PokemonList("フシギダネ","ふしぎだね" )  
   )   
   val actPokeNm: AutoCompleteTextView = findViewById(R.id.pokemon_name)  
   val pokeNmAdapter : ArrayAdapter<PokemonList> = CustomPokeNmLIst(this, R.layout.autocompleteview, pokemonNmList )  
   actPokeNm.setAdapter(pokeNmAdapter)  

実際の動作

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

ぽんこつなりにがんばったことをつらつらと書き留める

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう