2012-07-12 57 views
1

我一直在嘗試顯示一個指南針以及我的位置和地圖上另一個位置之間的距離。ListView中的物理距離

幾乎完全一樣:

Android: compass + distance in a listview

我理解代碼,建立一個監聽器,用於檢測取向的改變,並且還計算出的距離。

此外,我在我的ListView中顯示正確的距離(我已經有一個自定義適配器)。這是對我的位置的一點澄清。

這是我的問題:我通過監聽更新ListView的每一秒,通過改變實際列表的適配器看值和調用:

notifyDataSetChanged(); 

調用此每一秒都是正如我預料的那樣,使ListView變得遲緩。我可以每隔10秒左右(或多一點)更新距離。但是,我必須更頻繁地更新列表以獲得現場指南針。我一直在環顧四周,我無法找到任何東西,我會很感激所有我能得到的幫助。謝謝!

附註:如果您需要查看我編寫的任何代碼,我願意將其粘貼到此處。有很多部分,所以我會按需求做。

+0

你想得到什麼精度?因爲如果你處理很大的距離(如公里),你不需要每秒更新它們,5-10可能就足夠了。 – shem 2012-07-12 13:58:21

+0

這絕對是在公里數,但隨着人們靠近它可能會變得更好。 (我可以擺脫只顯示「<1公里」,但讓我們看看)。但那不是真正的問題,這是我真正擔心的指南針標題。 – somanys21 2012-07-12 15:12:59

回答

1

恕我直言,你應該省略整個列表視圖和適配器。最好的方法是創建自己的觀點,對於應該經常更新的元素。

例如創建名爲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); 
     } 
    } 
} 

標準傳感器現已在活動處理適用所以檢測時禁用傳感器是沒有問題的,你不必擔心內存泄漏。我懷疑,即使你不需要更改代碼:)。 爲了使它更好,你可以定義接口。

+0

(我會投票,如果我可以) 雖然我感謝您的答案,我想看看是否有人回覆更符合我已經做了什麼(我敢肯定,你明白)..如果不會發生或切斷它,我會在下一次嘗試你的方法。再次謝謝你! – somanys21 2012-07-12 15:11:35

+0

啊感謝您的更新!我會試試看,並回復你! 你們真是一羣了不起的人。 – somanys21 2012-07-13 10:38:18

+0

好吧,快速更新:我們決定爲我們的下一個版本推送此功能。但非常感謝你,我會接受你的回答,因爲我打算在以後使用它。 – somanys21 2012-07-20 06:13:31