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

AQuery(Android jQuery)を拡張して実装されてないメソッドを追加する方法

AQuery(Android jQuery)とは

前にも紹介したんですが,AQueryはAndroidのUI周りのコードをjQuery風にメソッドチェーンを使って簡潔に記述できるやつで,一度使うと利用しないのは考えられない便利ライブラリです.
ただAqueryをそこそこ使っていると一部のメソッドが実装されていない事に不満を感じるので,今回はAqueryに自分で足りないメソッドを実装する方法を紹介します.

とりあえず本家のサイトをみる

本家サイトのwikiカテゴリーの"Extension + Contribution"の"Extension"に拡張のする場合のサンプルコードがあります.とりあえずこれを真似してクラスの作ります.
重要なのは,AbstractAQueryを継承して型(?)に自分のクラスを指定する所と,追加したメソッド(下の場合はmyMethod)はthisを返す所です.こういう書き方は多分メソッドチェーンっぽいことをするための仕組みなんだと思います.

public class MyQuery extends AbstractAQuery<MyQuery>{

        public MyQuery(View view) {
                super(view);
        }

        public MyQuery(Activity act) {
                super(act);
        }
        
        public MyQuery myMethod(String text){
                
                if(view != null){               
                        //do something to the view              
                }
                return this;
        }
        
}

ListViewのOnItemLongClick を実装してみる

大体仕組みはわかって来たので,今度は前から欲しかったOnItemLongClick(ListViewの長押しイベント)を実装します.
ただ何も見ずに書けるほど僕にはJava力がないので,とりあえずAQueryのソースコードをクローンして似たようなコードを探しました.こういう時ackとか使うと便利です(・∀・)
今回は "onItemClick"の実装を参考にすることにしました.

f:id:kazy1991:20130415144353p:plain

そうすると "src/main/java/com/androidquery/AbstractAQuery.java"の1390行付近にあるということなので,とりあえずコピペしてきます.

public T itemClicked(OnItemClickListener listener){
        
        if(view instanceof AdapterView){
        
            AdapterView<?> alv = (AdapterView<?>) view;
            alv.setOnItemClickListener(listener);
        
        }
        
        return self();
        
    }   

ちなみに,僕はここで "T" ってなんだろうって思ったんですが,ここに詳しく紹介されていました.
まだまだJavaは知らないことがいっぱいあります.

Javaジェネリクス再入門 - プログラマーの脳みそ

とりあえず,これを参考にOnItemLongClickのメソッドを書きます.

public MyExtentionAquery itemLongClicked(OnItemLongClickListener listener){
        
        if(view instanceof AdapterView){
            AdapterView<?> alv = (AdapterView<?>) view;
            alv.setOnItemLongClickListener(listener);
        }
        return this;
        
    }   

ほとんど変わってないですが,returnでthisを返して,返り値の型は自分自身のクラスに変更しました.

これで実装できたので Aqueryの代わりに自分で拡張したAqueryを呼び出せば itemLongClickedを使うことができるようになります. 便利ですね.