3

リストビューにいくつかの場所を表示するアプリに取り組んでいます。すべてのリストビュー項目には、場所 (ホテル、バーなど) を指す矢印があります。

問題は、ビューをローカルにキャッシュせずに、この矢印を効率的に更新し続ける方法がわからないことです (これは、Google I/O ビデオによると、私が決してすべきではないことです)。

矢印は、電話の向きセンサー イベントごとに更新する必要があります。これは 1 秒間に何回も行われます。

すべてのイベントで notifyDataSetChanged() を呼び出し、すべてのリスト項目データを再設定するよりも良い方法はありますか?

更新(@dharanおよび興味のある人向け):

現在フルタイムの仕事をしているため、このプロジェクトへの取り組みを停止しましたが、解決策を考えました (未実装/未テスト)。

最初に回転角度を固定ステップ (例: 5、10、15、20、... 355、360) に制限し、負荷の高い画像回転計算を避けるために、回転角度ごとに回転した画像をキャッシュします (ただし、より高いメモリ コスト)。

その後、すべてのデータではなく画像のみを更新するタイミングを getView() メソッドに知らせます。私の場合、これは次のように簡単です。

public View getView(int position, View convertView, ViewGroup parent) {
     if (convertView != null && place[position].id == (Integer)convertView.getTag()){
         //the place information is already set correctly so just update the image
     }
     ...
}

これらの変更の後、notifyDataSetChanged() を呼び出しても重大なパフォーマンスの問題が発生することはないと思います。

4

1 に答える 1

2

ListView にあまり多くの項目がない場合は、プレーンな LinearLayout を使用するように変換し、それらの項目を個別に制御できます。ただし、LinearLayout の問題は、アイテムのサイズが変更された場合、すべて (つまり、すべての子) を中継する必要があることです。そのため、1 つのアイテムの変更をトリガーすると、他のものもレイアウトに再トリガーできます。コンパスの針を変更しているため、各行の全体的なサイズが変更されないため、その周りをスカートで囲むことができる場合があります。そのアイテムを再描画するだけです。

もう 1 つのオプションは、汎用のレイアウト マネージャーでは不可能ないくつかの前提条件を使用して、いくつかのショートカットを使用する独自のレイアウトを作成することです。最後に確認することは、内部で notifyDataSetChanged() が何をしているのかです。ListView を拡張して、変更された行のみを再描画するメソッドを作成できる場合があります (もちろん、これは行の高さが変更されていないことを前提としています)。行の高さが変更された場合、その行以降のすべてをリレーアウトする必要があります。

于 2012-05-28T19:29:44.340 に答える