经常调用notifyDataSetChanged()会导致展开列表视图无法折叠和展开

时间:2015-10-20 19:38:59

标签: android expandablelistadapter

我有一个自定义适配器扩展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()过于频繁地调用以响应用户在列表上的单击操作,这种情况有什么解决方案吗? 如何正确更新自定义适配器的数据,而不对折叠和扩展操作产生任何副作用?

1 个答案:

答案 0 :(得分:0)

你应该限制sensorChanged事件。也就是说,如果自上次更新后至少有一定的时间(例如1秒),则只调用notifyDataSetChanged() - 这将为UI线程提供足够的时间来处理用户交互。

请参阅Filtering out noise from Android tilt (accelerometer and magnetic field) sensors?How to slow down android sensor events