6

各行に 3 つの textview フィールドがある非常に単純なリストがあります。バックグラウンド Web サービス呼び出し ( AsyncTask ) からのデータを使用して、2 秒ごとに値を更新しています。

今後の値を現在の値と比較し、それに応じてアダプタで更新し、必要に応じて最後に notifyDataSetChanged() を呼び出します。

問題は、一度に 3 つ以上の更新行を取得すると、再描画が非常に遅くなるため、UI 全体がハングすることです。もちろん、EfficientAdapter アプローチ ( setTag() および holders ) や getViewTypecount()/getItemViewType() など、ListView のよく知られた最適化をすべて使用しています。また、layoutopt を使用してインターフェイスを可能な限り最適化し、wrap_content の幅と高さを避けて軽量化を試みました。

私たちのアップデートではコストのかかる操作も行いません。TextView のテキスト、textcolor、および backgroundcolor の値を変更するという標準的な操作だけです。

私が見ることができる唯一の奇妙なことは、getView() が行ごとに 3-4-5 回呼び出されることです。

どうすれば高速化できるかについてのアイデアやヒントはありますか?

どうもありがとうございました!

[1] http://groups.google.com/group/android-developers/browse_thread/thread/4c4aedde22fe4594/aeb04288064f495e?show_docid=aeb04288064f495e

4

2 に答える 2

2

これは、独自のデータ変更メソッドを書き換える必要があると考えている Google からブラウジングする人向けです。私のデータに基づくと、多くの場合必要ありません。

notifyDataSetChanged()手動でコード化された置換よりもはるかに高速になる可能性があり、それはすべて実際のlistview実装に依存します。

ArrayListサンプル:メニュー選択によって更新される最大 10K 行のシンプルな 3 行のテキストのみのリストビュー。

マニュアルnotifyDataSetChange()

--- avg run-time: 4ms

デフォルト無料notifyDataSetChange()

--- avg run-time: 0ms <--- you can't get faster than this.

時間をかけてベンチマークを実施しない限り、独自の代替品を作成するために実行しないでください。必要になるまで無料のものを使用してください。

于 2012-12-12T09:23:21.020 に答える
0

更新を取得する URL として、タグを ur textView に設定できると思います。また、「notifyDataSetChanged()」を呼び出す代わりに、そのビューに findViewByTag(update URL) と setText を使用してみてください。これにより、リスト全体ではなく textview のみが何度も再描画されます。余分な塗り直しの回数を十分に減らします。ちょっとした考え。

于 2011-10-06T08:02:36.250 に答える