読者です 読者をやめる 読者になる 読者になる

tumblr

tumblr(タンブラー)は、メディアミックスブログサービス。ブログとミニブログ、そしてソーシャルブックマークを統合したマイクロブログサービスである。アメリカのDavidville.inc(現: Tumblr, Inc.)により2007年3月1日にサービスが開始された。

FilteredArrayAdapterでローマ字入力からサジェスト

前回のTokenAutoCompleteの使い方の進んだ版みたいなの。

普通にTokenAutoCompleteを使っただけだと「レイルズ」というタグをサジェストしたいとき、「ra」と入力しても候補は出てこない。「レイ」と入力しないと候補が出てこない。なので「rei」とローマ字入力してカタカナに変換した時点でやっと出てくる。わざわざ変換せず「rei」と入力した時点で「レイルズ」というタグが出てきて欲しいけどそのままじゃそうはいかないので、FilteredArrayAdapterを使ってカスタムフィルターを作ってサジェストさせる。FilteredArrayAdapterはTokenAutoCompleteに含まれているクラス。

カスタムフィルタの作り方

基本は前回のTokenAutoCompleteと同じ。Viewクラスと候補表示用のレイアウト、タグエンティティクラスを作成する。 ただ、今回はローマ字を元にタグをサジェストさせたいのでちょっとだけタグエンティティクラスに細工をしておく。

public class TagEntity implements Serializable {

    private String name;
    private String yomiRoma;

    public TagEntity(){}

    public TagEntity(String name, String yomiRoma){
        this.name = name;
        this.yomiRoma = yomiRoma;
    }

    public String getName() {
        return name;
    }

    public String getRoma() {
        return yomiRoma;
    }

    public String toString(){
        return name;
    }

}

ローマ字での表記を格納できるようにしておく。

アクティビティに組み込む

Acticity側では、ArrayAdapterを使わずにFilteredArrayAdapterを使う。その時にkeepObjectメソッドをオーバーライド。

public class TokenAutoCompActivity extends AppCompatActivity {

    private AutoTagCompletionView completionView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_token_auto_comp);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        TagEntity tags[] = new TagEntity[]{
                new TagEntity("アンドロイド", "android"),
                new TagEntity("レイルズ", "reiruzu"),
                new TagEntity("ルビイ", "rubii")
        };

        ArrayAdapter<TagEntity> adapter = new FilteredArrayAdapter<TagEntity>(this, android.R.layout.simple_list_item_1, tags) {

            @Override
            protected boolean keepObject(TagEntity tag, String mask) {
                mask = mask.toLowerCase();
                return tag.getName().toLowerCase().startsWith(mask) || tag.getRoma().startsWith(mask);
            }
        };

        completionView = (AutoTagCompletionView)findViewById(R.id.tag_comp);
        completionView.setAdapter(adapter);
    }

}

keepObjectは文字を入力する度に呼び出され、その都度各タグが候補になるかをチェックしてくれる。なので、このメソッドの中でカスタムフィルタとしてやりたいことを書けばいい。今回は入力文字とタグのnameまたはローマ字での入力が重なっているかをチェックしている。やろうと思えば複雑な処理もこの中で出来るので色々なフィルタリングが可能。ただ、1文字入力または削除する度に追加したタグの回数分だけkeepObjectが呼ばれるので、余り複雑なことはしないほうがいいかもしれない。

f:id:shim0mura:20160501232611p:plain

なんにしても、これでローマ字からでもタグのサジェストができるようになった。