Edited at

ListViewやGridViewで一部の要素だけ更新する

More than 5 years have passed since last update.

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を再利用するようなコードを書いてないと更新されないので注意。