2012-07-12 2 views
1

나는 내 위치와지도상의 다른 위치 사이의 거리를 나침반에 표시하려고 노력했습니다.ListView의 물리적 거리

거의 정확하게 같은 I의 거리 계산과 같은 방향의 변화를 검출하는 수신기를 설정하고, 코드를 이해

Android: compass + distance in a listview

.

또한 맞춤식 어댑터가있는 ListView에 올바른 거리를 표시하고 있습니다. 그게 내가있는 곳에 대한 약간의 설명입니다.

내 문제입니다 :

notifyDataSetChanged(); 

을이 모든 둘째가 호출 : 나는 어댑터가보고되는 실제 목록의 값을 변경하고 호출하여 리스너를 통해 매초의 ListView를 갱신하고 내가 기대했던 것처럼 ListView가 뒤죽박죽이다. 거리를 10 초마다 업데이트하는 것으로 도망 갈 수 있습니다 (또는 조금 더). 그러나 라이브 컴퍼스를 사용하려면 훨씬 더 자주 목록을 업데이트해야합니다. 나는 주변을 둘러 보았고 아무 것도 찾을 수 없었습니다. 제가 얻을 수있는 모든 도움에 감사드립니다. 고맙습니다!

사이드 노트 : 필자가 작성한 코드를 보려면 여기에 붙여 넣으 려합니다. 많은 부분들이 있으므로 필요할 때마다 할 것입니다.

+0

원하는 정밀도는 무엇입니까? 당신이 큰 거리 (km와 같은)를 다룰 경우 매 초마다 그들을 업데이트 할 필요가 없기 때문에 원인이된다. – shem

+0

분명히 킬로미터에 있지만 사람들이 가까워 질수록 더 세밀해질 수 있습니다. (나는 "<1km"를 표시하는 것만으로 도망 갈 수 있지만 보게한다). 하지만 그건 진짜 문제가 아니에요, 제가 정말로 걱정하고있는 나침반 이죠. – somanys21

답변

1

IMHO 전체 목록보기 및 어댑터를 생략해야합니다. 가장 좋은 방법은 자주 업데이트해야하는 요소에 대한 자체 뷰를 만드는 것입니다.

예를 들어 setAbsouluteheading이있는 HeadingView라는보기를 만듭니다. 이 설정자는 어댑터에서 사용됩니다. 그런 다음 센서는 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

+0

업데이트 해 주셔서 감사합니다. 나는 이것을 밖으로 시도하고 다시 당신에게 돌아갈 것입니다! 너희들은 꽤 놀라운 사람들이다. – somanys21

+0

좋아, 빠른 업데이트 : 우리는 다음 릴리스에서이 기능을 사용하기로 결정했습니다. 하지만 고맙습니다. 나는 나중에 사용하려고하기 때문에 대답을 받아 들일 것입니다. – somanys21