#ご挨拶 ドーモ!桂馬です。たまには日本語で何かを書かないと駄目だよね! ありがちな話ですけど、問題に当たっているときはすっげー悩むし必死で解決しようとするんだけど、実際それを解決してしまうと、とたんにどーでも良くなってしまう。 良くない。実に良くない。 貴方の問題は、みんなの問題なので、出来るだけ解決策をWebに残る形で公開したいですね。 それが、貴方がぶつかっていた問題を解決に導いた情報へのリスペクトで、 同じような問題にぶつかった未来の誰か(それは貴方自身かも知れない)への、あなたがしてあげられる社会貢献ですよ!

#本題: SQLiteの情報を(Expandable)ListViewに表示させるとき 現在、僕が公開している「Douga Downloader」では、ダウンロードしたURLデータをSQLiteでロギングしてます。 今のところ何かに役立っているわけではないのですが、今後使う予定があるので、実装した次第です。

さて、SQLiteデータベースの情報をListViewに流す方法は、ググればたくさん見つかるかと思います。 (そのためにはSQLiteから適切な形でデータを貰っておく必要がありますが。) (あと、スクロール場所に応じて動的に読み込むやり方は各自でお調べ下さい) 一例としては:

さて、ListViewにデータベース情報がセットされ、次にやりたいことは、リストをタップして詳細情報を閲覧したくなるわけですが。 以下のような感じで実装を考えてみます。

  • リスト自体はファイル名などの大雑把な情報
  • リストをタップすると詳細をみるActivityが起動
  • 詳細Activityでは、データベースの情報を詳細に見ることが出来る
  • リストから詳細Activityへ渡す情報は少なく(ExtraにDBの全情報入れるなどはやらない)

となると、詳細Activityへ渡す情報は、データベースのIDとなりそうですね。では、このIDをどこから参照するか? もちろんデータベースからIDをもらうのですが、それをリストと一意に結びづけておかないといけないわけです。 「hoge.jpg(ID:5)」の情報をみたいのに「foo.html(ID:2)」の情報が見れても嬉しくないわけです。

MapにキーとIDを追加してみる

ListViewは、Map<>を内包するList<>で構成されています。

List<Map<String, String>> dateList = new ArrayList<Map<String, String>>();
List<List<Map<String, String>>> urlList = new ArrayList<List<Map<String, String>>>();

ようするに、Map<>にキーとIDをセットしてあげればOKです。

onClickのときがめんどくさい

  • リストをタップする
  • リストの何処をタップしたか等がonClickListenerから渡される
  • 「手がかり」を元に、リストのどの要素かを抽出
  • Mapから値を取り出す
  • Activity起動

こんな流れですが、リストのどの要素かを指定するところが難しい。 僕はこんな感じでかきました。

@Override
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition,
        int childPosition, long id) {
    // child = タップされた要素のMap<>
    @SuppressWarnings("unchecked")
    Map<String, String> child = (Map<String, String>) parent.getExpandableListAdapter()
            .getChild(groupPosition, childPosition);
    int rowid = Integer.valueOf(child.get("DATABASE_ROWID"));

    Intent intent = new Intent(this, HistoryDetailActivity.class);
    intent.putExtra("rowId", rowid);
    startActivity(intent);

    return super.onChildClick(parent, v, groupPosition, childPosition, id);
}

こんな感じで、初見では気がつかねーよバーカ!という感じなのですが、まぁ取得できたのでこれでいいや。。。

まとめ

ListViewをタップすることで、詳細を確認できるActivityに移動できるようになりました(小学生並みの感想)

該当部分のどうでも良いところをけずったソースはこちら。 https://gist.github.com/3763291

それにしても、ちょっとアルゴリズムが汚いところあったりして恥ずかしいですね。良いアルゴリズムあったら書き換えといてください(何