私見では、リストビューとアダプタ全体を省略する必要があります。最善のアプローチは、頻繁に更新する必要がある要素に対して独自のビューを作成することです。
たとえば、setAbsouluteheadingを持つHeadingViewというビューを作成します。このセッターはアダプターによって使用されます。次に、viewはSensorEventListenerも実装して、センサーを監視し、デバイスの見出しを取得します。相対方向を変更する必要がある場合、HeadingViewはそれを自動的に更新します。この場合の問題は、HeadingViewがセンサーイベントに対して自身を登録/登録解除する必要がある場合の検出です。onWindowFocusChangedは有望に見え、onWindowSystemUiVisibilityChanged(APIレベル16)が必要です。
いくつかのコーナーケースが発生する可能性があり、必要なときにビューがセンサーの監視から登録解除されないという危険性があることを忘れないでください。これにより、スリープモードでの消費電力がひどくなる可能性があるため、徹底的なテストを行うことを忘れないでください。
このHeadingViewとセンサーの間の通信を実行する別の方法がおそらくありますが、一般的に私の概念は良い解決策だと思います。
アップデート:
センサーを無効にしたときの検出に問題がなく、メモリリークが発生しないように、このHeadingViewと通信する方法についてより良いアイデアを思いつきました。答えは、週の参照、より正確にはWeakHashMapです。
HeadingViewビューは、前に説明したように多かれ少なかれですが、コンストラクターでは、YourActivityにその存在を通知します。したがって、次のようになります。
public class HeadingView extends View {
public HeadingView(Context context) {
super(context);
YourActivity activity = (YourActivity) context;
activity.addWeekSensorObserver(this);
}
}
そしてあなたの活動:
public class YourActivity extends Activity implements SensorEventListener {
// there is no WeekSet and WeakHashMap is more handy then List<WeakReference>
private final WeakHashMap<HeadingView, Object> sensorObservers = new WeakHashMap<HeadingView, Object>();
public void addWeekSensorObserver(HeadingView headingView) {
sensorObservers.put(headingView, null);
}
private updateHeadings(float[] deviceHeading) {
Set<HeadingView> keySet = sensorObservers.keySet();
for (HeadingView headingView : keySet) {
headingView.setDeviceHeading(deviceHeading);
}
}
}
アクティビティ中の標準センサー処理が適用されるようになったため、センサーを無効にするタイミングの検出は問題にならず、メモリリークについて心配する必要はありません。コードをあまり変更する必要はないと思います:)。それをより良くするために、あなたはインターフェースを定義することができます。