恕我直言,您应该省略整个列表视图和适配器。最好的方法是为应该经常更新的元素创建自己的视图。
例如,创建名为 HeadingView 的视图,该视图将具有 setAbsouluteheading。此设置器将由适配器使用。然后视图也将实现 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);
}
}
}
活动中的标准传感器处理现在适用,因此检测何时禁用传感器不是问题,您不必担心内存泄漏。我怀疑即使您也不必大量更改代码:)。为了使它更好,您可以定义接口。