我正在创建一个具有以下功能的应用程序。
- 用户选择设备中可用的传感器
- 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
,但如何实时获取值?
非常感谢。
我使用以下方法解决了我的问题。。。。
-
创建一个读取传感器的类
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();}
-
定义一个单独的类
TempStore
,该类包含两个静态字段CCD_ 5和CCD_数据,并分别填充ListView。public class TempStore { public static ConcurrentMap<String, RealTimeSensor> sensor = new ConcurrentHashMap<>(); public static ArrayList<RealTimeSensor> realTimeSensors = new ArrayList<>();
-
在onSensorChanged方法中,我将传感器值与传感器一起放入name作为HashMap的键。只要传感器发生变化。
-
创建了一个收听该广播的广播侦听器,并且清除当前LinkedList值,然后添加HashMap。
TempStore.realTimeSensors.clear(); TempStore.realTimeSensors.addAll(TempStore.sensor.values());
我需要知道的是这种方法是正确的还是错误的。
非常感谢