ListViewやGridViewで表示を更新したいときに
AbsListView#invalidateViews()
やBaseAdapter#notifyDataSetChanged()
で更新を促すんだけど、これだと表示してるView全てを更新してしまう。
特にGridViewだと、一要素の大きさにもよるけど、大抵何十個も表示してるので、全ての要素の更新するのは無駄な場合もある。
今回はドラッグ&ドロップで並べ替えた要素のみの更新をやりたいので、表示してるView全部更新するのは効率良くない。
なので、部分的に更新する方法がないか探してみた。
結果stackoverflowに解決策があった。
Redraw a single row in a listview
/*
* データの更新とか
*/
targetPosition // 更新対象のposition
gridView // GridViewのインスタンス
// 更新対象のViewを取得
View targetView = gridView.getChildAt(targetPosition);
// getViewで対象のViewを更新
gridView.getAdapter().getView(targetPosition, targetView, gridView);
データの更新をした後に対象のpositionのgetView()を呼び出せばいいだけ。
ただ、getView()の中でちゃんとconvertViewを再利用するようなコードを書いてないと更新されないので注意。