恕我直言,你應該省略整個列表視圖和適配器。最好的方法是創建自己的觀點,對於應該經常更新的元素。
例如創建名爲HeadingView的視圖,該視圖將具有setAbsouluteheading。這個setter將被適配器使用。然後視圖也會實現SensorEventListener來觀察傳感器並獲取設備標題。 當相對方向改變時,HeadingView會自動更新它。這種情況下的問題是當HeadingView應該爲傳感器事件註冊/註銷自己時進行檢測。 onWindowFocusChanged看起來很有希望,並且onWindowSystemUiVisibilityChanged(API級別16)是您所需要的。
請記住,存在可能存在一些轉角情況的危險,並且您的視圖在它應該時不會從觀察傳感器取消註冊。這可能會導致睡眠模式下功耗嚴重不足,因此請記住做大量的測試。
在這個HeadingView和傳感器之間可能有其他方法可以進行通信,但我認爲一般來說,我的概念是很好的解決方案。
更新:
我已經想出了更好的想法如何與此HeadingView進行通信,而無需檢測何時禁用傳感器並且不會導致內存泄漏。答案是week reference或更確切地說是WeakHashMap。
HeadingView視圖或多或少像我之前解釋的那樣,但在構造函數中它會通知YourActivity它的存在。因此,這將BES類似的東西:
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);
}
}
}
標準傳感器現已在活動處理適用所以檢測時禁用傳感器是沒有問題的,你不必擔心內存泄漏。我懷疑,即使你不需要更改代碼:)。 爲了使它更好,你可以定義接口。
你想得到什麼精度?因爲如果你處理很大的距離(如公里),你不需要每秒更新它們,5-10可能就足夠了。 – shem 2012-07-12 13:58:21
這絕對是在公里數,但隨着人們靠近它可能會變得更好。 (我可以擺脫只顯示「<1公里」,但讓我們看看)。但那不是真正的問題,這是我真正擔心的指南針標題。 – somanys21 2012-07-12 15:12:59