我有一个自定义适配器扩展BaseExpandableListAdapter,活动读取android传感器数据,一旦传感器数据发生变化,我将设置传感器数据并调用 notifyDataSetChanged 到我的自定义适配器来更新其数据,所以列表视图可以显示刷新的传感器值。
由于正在读取MAGNETIC_FIELD传感器,因此数据会非常频繁地更新。 我发现在这种情况下,“可扩展”列表视图不起作用,既不会崩溃也不能很好地扩展。
我活动中的一段代码:
private void setMagnetometerData(float x, float y, float z)
{
StringBuilder sBuilderX = new StringBuilder();
StringBuilder sBuilderY = new StringBuilder();
StringBuilder sBuilderZ = new StringBuilder();
magnetometerData = new float[3];
magnetometerData[0] = x;
magnetometerData[1] = y;
magnetometerData[2] = z;
sBuilderX.append("x = ");
sBuilderX.append(magnetometerData[0]);
magnetometerStrX = sBuilderX.toString();
sBuilderY.append("y = ");
sBuilderY.append(magnetometerData[1]);
magnetometerStrY = sBuilderY.toString();
sBuilderZ.append("z = ");
sBuilderZ.append(magnetometerData[2]);
magnetometerStrZ = sBuilderZ.toString();
adapter.mChilds[1][0] = magnetometerStrX;
adapter.mChilds[1][1] = magnetometerStrY;
adapter.mChilds[1][2] = magnetometerStrZ;
adapter.notifyDataSetChanged();
}
@Override
public void onSensorChanged(SensorEvent event)
{
float[] sensorsData = event.values;
int sensorType = event.sensor.getType();
switch(sensorType)
{
case Sensor.TYPE_AMBIENT_TEMPERATURE:
setTemperatureData(sensorsData[0]);
break;
case Sensor.TYPE_MAGNETIC_FIELD:
setMagnetometerData(sensorsData[0], sensorsData[1], sensorsData[2]);
break;
default:
break;
}
}
我认为这是由于notifyDataSetChanged()过于频繁地调用以响应用户在列表上的单击操作,这种情况有什么解决方案吗? 如何正确更新自定义适配器的数据,而不对折叠和扩展操作产生任何副作用?
答案 0 :(得分:0)
你应该限制sensorChanged事件。也就是说,如果自上次更新后至少有一定的时间(例如1秒),则只调用notifyDataSetChanged()
- 这将为UI线程提供足够的时间来处理用户交互。
请参阅Filtering out noise from Android tilt (accelerometer and magnetic field) sensors?和How to slow down android sensor events