在列表视图中实时显示选定的传感器值



我正在创建一个具有以下功能的应用程序。

  1. 用户选择设备中可用的传感器
  2. UI在列表视图中显示选定的传感器名称和读数。(值实时更新)

我有一个自定义类来存储传感器数据(SenseData),还有一个自定义视图来显示传感器名称和读数。

我编写了一个自定义Adaptor类,它使用SenseData列表来填充我活动中的列表视图组件。

我想做的是,列出一份SenseData。

我尝试了大约一个星期,但没有得到任何解决方案。如果有人能给我一个提示,我将不胜感激。

编辑:

适配器类

public class SensorAdaptor extends BaseAdapter{
Context context;
List<SenseData> senseData;
public SensorAdaptor(Context context, List<SenseData> senseData){
    this.context = context;
    this.senseData = senseData;
}
@Override
public int getCount() {
    return senseData.size();
}
@Override
public Object getItem(int position) {
    return senseData.get(position);
}
@Override
public long getItemId(int position) {
    return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View view;
    if(convertView == null){
        view = inflater.inflate(R.layout.view_sensor, parent, false);
        holder = new ViewHolder();
        holder.name = (TextView) view.findViewById(R.id.senseName);
        holder.data = (TextView) view.findViewById(R.id.senseReading);
        view.setTag(holder);
    }else{
        view = convertView;
        holder = (ViewHolder) view.getTag();
    }
    SenseData data = senseData.get(position);
    holder.name.setText(data.getSensorName());
    holder.data.setText(data.getSensorValues());
    return null;
}
public class ViewHolder{
    TextView name;
    TextView data;
}
}

onSensorChanged方法

    @Override
public void onSensorChanged(SensorEvent event) {
    this.event = event;
//SupportedSensors contains the predefined sensor types. sensor is a SenseData type object
    Intent filter = new Intent(new 
SupportedSensors().getType(event.sensor.getType()));
    filter.putExtra("value", event.values[0]);
    ctx.sendBroadcast(filter); //ctx is the context
}

然后我接收带有过滤器的广播,这些过滤器将传感器名称作为动作。但我找不到在广播接收器中返回列表的方法。SenseData类具有用于设置和获取数据的setter和getter。

public class SensorBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
    switch(intent.getAction()){
        case "accelerometer":
            System.out.println("Accelerometer");
            break;
        case "gyroscope":
            System.out.println("Gyroscope");
            break;
        case "gravity":
            System.out.println("Gravity");
            break;
        case "proximity":
            System.out.println("Proximity");
            break;
        case "pressure":
            System.out.println("Pressure");
            break;
        case "light":
            System.out.println("Light");
            break;
        case "magnetometer":
            System.out.println("Magnetometer");
            break;
        case "rotation":
            System.out.println("Rotation Vector");
            break;
    }
}

接收器已在活动中注册

    IntentFilter filter = new IntentFilter("accelerometer");
    SensorBroadcastReceiver receiver = new SensorBroadcastReceiver();
    registerReceiver(receiver, filter);

我可以将List<SenseData> sensordatalist添加到SensorBroadcastReceiver,但如何实时获取值?

非常感谢。

我使用以下方法解决了我的问题。。。。

  1. 创建一个读取传感器的类RealTimeSensorReader

    public void onSensorChanged(SensorEvent event) {
    RealTimeSensor realTimeSensor = new RealTimeSensor();
    realTimeSensor.setName(AvailableSensors.getType(event.sensor.getType()).toUpperCase());
    realTimeSensor.setValueX(event.values[0]+"");
    realTimeSensor.setValueY(event.values[1]+"");
    realTimeSensor.setValueZ(event.values[2]+"");
    System.out.println(values);
    TempStore.sensor.put(AvailableSensors.getType(event.sensor.getType()), realTimeSensor);
    Intent intent = new Intent();
    intent.setAction("sensor");
    context.sendBroadcast(intent);
    adaptor.notifyDataSetChanged();}
    
  2. 定义一个单独的类TempStore,该类包含两个静态字段CCD_ 5和CCD_数据,并分别填充ListView。

    public class TempStore {
    public static ConcurrentMap<String, RealTimeSensor> sensor = new ConcurrentHashMap<>();
    public static ArrayList<RealTimeSensor> realTimeSensors = new ArrayList<>();
    
  3. 在onSensorChanged方法中,我将传感器值与传感器一起放入name作为HashMap的键。只要传感器发生变化。

  4. 创建了一个收听该广播的广播侦听器,并且清除当前LinkedList值,然后添加HashMap。

    TempStore.realTimeSensors.clear();
    TempStore.realTimeSensors.addAll(TempStore.sensor.values());
    

我需要知道的是这种方法是正确的还是错误的。

非常感谢

最新更新