« 2013年11月 | トップページ | 2014年1月 »

2013年12月の2件の記事

2013.12.07

Gmail Public Labels API は selection が使えない

The Gmail Public Labels API は、ただの ContentProvider なんだけど、query() するときに第3引数の selection が使えないので注意!

この API を使ってる他のソースをぐぐってみると、Google が作ってるソースが見つかって、(このリンクはいつまで使えるのだろうか?)

    private Cursor openLabelsCursor(String account) {
        try {
            return getContentResolver().query(
                    GmailContract.Labels.getLabelsUri(account),
                    LabelsQuery.PROJECTION,
                    null, // NOTE: the Labels API doesn't allow selections here
                    null,
                    null);
        } catch (SQLException e) {
            // From developer console: "SQLiteException: no such table: labels"
            LOGE(TAG, "Error opening Gmail labels", e);
            return null;
        }
    }
と、"NOTE: the Labels API doesn't allow selections here" と書かれてるのでした。

当然、第4引数の selectionArgs を使って指定してみても使えない。
普通に ContentProvider として公開するなら、selection まで実装してくれよ。30分ぐらいハマったよ。。

| | コメント (0) | トラックバック (0)

2013.12.01

ListView に自作の Adapter を使うときの注意点?

だだのメモ。
いまいちよくわからん動作なのでメモ。

BaseAdapter を継承した Adapter を、ListView#setAdapter() して使っている場合、BaseAdapter#notifyDataSetChanged() を呼ぶと、getView(0, null, xxx) が呼ばれるみたいだ。
ListView 側の ListView#invalidateViews() を呼んでも、同様に呼ばれる。
ListView#invalidate() では呼ばれない。

通常は画面サイズ分の十分な数の View を作ったら、もう新しい View を作る必要はないのだが、BaseAdapter#notifyDataSetChanged() or ListView#invalidateViews() を呼んだ時は position=500 とかを表示してる場合でも、position=0 が呼ばれてから、position=500, 501, 502, .. が呼ばれる。

で、position=500, 501, 502, ...  は以前に作った空いた View が渡されるので、更新すればいいだけなんだけど、position = 0 のは  convertView = null で呼ばれる。
ので、新しい View を作る必要があって、、でも、新しい View を作っても 500 行目を表示してたら使われない。
直後に 0 行目までジャンプしても、position = 0 で convertView = 過去に作った空いたやつ、の方の事が使われてたりして、表示がおかしくなる。。

というのでハマった。

なんか間違ってる??

| | コメント (0) | トラックバック (0)

« 2013年11月 | トップページ | 2014年1月 »