前回はEvernoteに保存した画像をAndroid上で表示させてみました。今回は表示した画像をタップすることで、ノートを別の画像で置き換えられるようにしたいと思います。
まず、GridViewのアイテムをタップしたときの処理には、android.widget.AdapterView.OnItemClickListenerを実装する必要があります。
そして、onCreateメソッドでGridViewに自分自身をリスナーとして追加します。
OnItemClickListenerで実装しなければならないのは、onItemClickメソッドです。このメソッドがGridViewのアイテムをタップしたときに実際に呼び出されます。ここでは、"Select Image..."ボタンで選択した画像を使用して、タップした画像に対応したノートを更新します。
ImageResource image = (ImageResource)parent.getItemAtPosition(position);で、タップした場所に対応するオブジェクトを取得します。ImageResourceは前回使用したBitmapの代わりに新しく用意したクラスですが、詳しくは後述します。ImageResourceに含まれるノートのGUIDを指定して、Evernoteからリソースを含んだノートを取得します。
ノートに含まれる画像を置き換えるために、まず現在の画像をノートのリソース内から探して削除します。リソースから削除をせずにノートの<en-media>だけ消してしまうと、ノートには表示されない画像を裏で保持することになってしまいますので気をつけてください。その後に選択した画像のリソースをノートに加えますが、コードはsaveImageメソッドと同様です。
ノートの更新には、updateNoteメソッドを用います。createNoteメソッドと使い方は同じですが、ノートが更新の対象となるGUIDを含んでいる必要があります。ここではノートのコンテンツを完全に新しくして置き換える形を取りましたが、以前のコンテンツのen-mediaを書き換えて画像だけを変更するというのでも良いでしょう。
タップの場所とノートやリソースのGUIDを紐づける
さて、前回は画像を表示させることだけを考えていたので、ImageAdapterにはBitmapを登録するようにしていました。しかし、更新するためにはタップされた場所とノートやリソースのGUIDが紐づいていないといけません。そのため、必要な情報を持つためのImageResourceというクラスを作成して、Bitmapの代わりにImageAdapterに登録するようにしました。以下のコードをImageResource.javaとして、src/com.evernote.android.sampleに置いてください。渡したリソースからノートのGUID、リソースのGUID、bitmapだけ取り出して持つようにしています。
また、ImageAdapterの中のBitmapを全てImageResourceに変更します。
最後に、HelloEDAM.javaのshowImageメソッドでImageAdapterに画像を追加する部分を、以下のように簡略化します。データからBitmapの作成はImageResourceに任せるようにしました。
これで完成です。"Show Images"で画像一覧を表示した後に、"Select Image..."で画像を選択してください。表示した画像をタップしてしばらくすると"Image saved to Evernote"というメッセージが表示されますので、サンドボックス上のデータを見てみましょう。以下のようにノートが変更されているはずです。もう一度"Show Image"を押して再取得するとAndroid側の表示も変更されます。今後の改良としてはEvernote側を変更すると同時にAndroid側の画像も更新するといったことが考えられます。
今回まで数回に渡って、モバイルアプリケーションの例としてAndroidからのEvernoteの操作について解説をしました。次回からはWebサービスの例として、Google App EngineからEvernote APIを使ってみたいと思います。
今回取り上げたサンプルコードはこちらからダウンロードできます。
ダウンロード後、Eclipse上でimportして、consumer_key、consumer_password、username、passwordを設定すれば動きます。