2011年6月12日日曜日

リストビューの項目を任意移動

編集画面のリスト操作したいなーって、どっかで見かけたなーとか思って探してたらvvakameさんとことか、tomorrowkeyさんとことにこれこれすげーな情報があったわけです。

apk公開されてたのでインストールして動かしてみたんだけど、ちょっと欲しいものピッタリではない。

やりたいことは、
・ソートしたい
・削除処理いらない
・チェックボックスじゃなくてソースから制御したい
・移動中の横移動はないほうが良い(綺麗に見えそう)
でした。
取り込むにしても、ソース理解してカスタマイズせねばとトラックバックみたらshogo0809さんとでさらにカスタマイズしてあった。良く見たら電話帳Rの人だ。この前いれたばっかだ。ソート使ってみよう!コレダ感いっぱいの欲しいのあったーってことでいろんな方角に感謝しつつ取り込んでみた。
実行した。
ソートできた。
うひゃー。

でもちょっと違和感。
電話帳Rの機能をもう一回みてみた。
画面いっぱいにソート対象のリストビューが表示されている。
ソースを見てみる。
おそらく、SortableListViewクラスのupdateLayoutParamsでやってる
mLayoutParams.y = getTop() + y - 32;
の処理は
ドラッグ中画像のY = リストview上辺 + ドラッグ位置 - 微調整
みたいなことになってるんだけど
デバッグしてみたらgetTop()が0になってる。
リストビューを画面上のどこに配置しても、画面最上端からの距離でドラッグ位置ぐらいにしか描画してくれない。
現に、今取り込んだ俺のアプリではリストビューの上にいろいろ積んでるおかげで、ドラッグ位置の3センチぐらい上に画像が出現している。
getTopの説明にはリラティブなんとかとかあるから、リニアレイアウトだとダメとかあるのかも?
とりあえずまずい。

で、ちょっとだけ修正した箇所を。
(このブログのソース貼り付けってどうやったらいいんだろう、、とりあえず要所だけ)


[SortableListView.java]

1箇所目

/** ドラッグ開始 */
private boolean startDrag() {
~(前略)~
// Bitmap.createBitmapのあたりから
// ViewのOffsetを取得して、Viewの高さ/2を描画Offsetにする
int[] offset = new int[2];
this.getLocationOnScreen(offset);
mOffsetY = offset[1]- (view.getHeight()/2);
~(後略)~
}

2箇所目
/** ImageView 用 LayoutParams の座標情報を更新 */
protected void updateLayoutParams(int x, int y) {
//mLayoutParams.y = getTop() + y - 32;
mLayoutParams.y = mOffsetY + y - 32;
}

これでリストビューがどこにいても大体良い感じの場所に描画できるようになった。

※参考した皆さん、ソース公開していただいてありがとうございます。

0 件のコメント:

コメントを投稿