2013年8月9日金曜日

ListViewをリフレッシュせずに表示だけ変えたい

なぜ表示だけ変えたいか。
1変えるのに全部変えるとかバカス。
DBだけ変わってりゃいいんだよ。どうせActivityCreatedで更新すんだしさー。

前提
CotentProvider実装済み。
select発行→cursor.setNotificationUri(getContext().getContentResolver(), uri);
DML発行→getContext().getContentResolver().notifyChange(returnUri, null);
2013/08/13追記
DML発行→contentProviderコマンド投げたら特に何もしないに変更してました。
_idやらなんやらはView.GoneしてるTextviewのhintにこっそり設定してそれで掴んでます。
追記ここまで。

ListFragmentを使用。
getListView.setDivider(null)でデフォルトのディバイダーを消してます。
adapterはCursorAdapterをカスタムしたもの。
cursorloaderの戻り値をそのまんまadapterにセット。newでViewholdr。bindでv.getTag()。

更新の場合
更新するViewを取得してv.getTag()でViewHolderをゲット。
ViewHolderから内容を書き換える。
notifyとかdatasetchangedとか使ってない。

削除の場合
削除するViewをVisivle.GONEに設定。
v.getLayoutParams().height = 0にする。←力技です
notifyとかdatasetchangedとか使ってない。

GONEだけでは行が詰まらなかった。height = 0だとちゃんと行が詰まる。
height = 0 でViewのレイアウトの更新なのか、adatpterviewでの更新なのか不明。
もし、viewだけの更新ならView.Goneしてからそのトリガー呼べばできるか?

アニメーションつけて下のViewを上に上げるのが理想かな。
グルーピングできるなら一斉に動かせるのだろうけど、
たぶんできないと思うから連動かな。
LayoutTransition使えると楽そうなんだけどなー。ダミーでもつっこむか?

追加の場合
adapter自体を更新しないとだめみたい。
ぽいっといれられないのか?
ためしに無理やりCursor取得してそいつでnewView→bindViewを読んでみた。
CursorLoaderがおかしくなった。エラーにはならないけども。
リフレッシュしないといけないなら、
WHERE field1 = 'hoge' ORDER BY id Desc LIMIT 10 OFFSET 0 とかか?

getViewとかで何とかなりませんか。

他のadapterならどうなんだろうなー

0 件のコメント:

コメントを投稿