频繁调用notifyDataSetChanged()导致可展开列表视图无法折叠展开
Frequently calling notifyDataSetChanged() causes expandable list view can't collapse and expand
我有一个自定义适配器扩展 BaseExpandableListAdapter,activity 读取 android 个传感器数据,一旦传感器数据发生变化,我将设置传感器数据并调用 notifyDataSetChanged 到我的自定义适配器以更新其数据,以便列表视图可以显示刷新的传感器值。
由于正在读取 MAGNETIC_FIELD 传感器,因此数据更新 非常频繁 。
我发现在这种情况下,"expandable" 列表视图不起作用,既不能折叠也不能展开。
我的activity这里有一段代码:
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()调用太频繁导致用户在列表上的点击操作没有响应,请问有什么解决办法吗?
如何正确更新自定义适配器的数据并且不对折叠和展开操作产生任何副作用?
您应该限制 sensorChanged 事件。也就是说,只有在自上次更新后至少经过一定时间(例如 1 秒)时才调用 notifyDataSetChanged()
- 这将为 UI 线程提供足够的时间来处理用户交互。
见Filtering out noise from Android tilt (accelerometer and magnetic field) sensors? and
我有一个自定义适配器扩展 BaseExpandableListAdapter,activity 读取 android 个传感器数据,一旦传感器数据发生变化,我将设置传感器数据并调用 notifyDataSetChanged 到我的自定义适配器以更新其数据,以便列表视图可以显示刷新的传感器值。
由于正在读取 MAGNETIC_FIELD 传感器,因此数据更新 非常频繁 。 我发现在这种情况下,"expandable" 列表视图不起作用,既不能折叠也不能展开。
我的activity这里有一段代码:
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()调用太频繁导致用户在列表上的点击操作没有响应,请问有什么解决办法吗? 如何正确更新自定义适配器的数据并且不对折叠和展开操作产生任何副作用?
您应该限制 sensorChanged 事件。也就是说,只有在自上次更新后至少经过一定时间(例如 1 秒)时才调用 notifyDataSetChanged()
- 这将为 UI 线程提供足够的时间来处理用户交互。
见Filtering out noise from Android tilt (accelerometer and magnetic field) sensors? and