【发布时间】:2018-06-27 10:11:24
【问题描述】:
我正在构建一个可以从 BLE 设备下载一些数据的活动。现在,我想在我的活动的 ListView 中实时获取这个值。 但我无法做到这一点。这是我的代码:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ble);
listView = (ListView) findViewById(R.id.list_view);
listView.setOnScrollListener(new OnListListener());
adapter = new SensorDataAdapter(classe, R.layout.sensordata_row, new LinkedList<SensorData>());
listView.setAdapter(adapter);
refreshListViewByPosition(null);
adapter.notifyDataSetChanged();
}
public void refreshListViewByPosition(Integer pos) {
String tipoCaratteristica=null;
if(pos!=null && pos ==0)
tipoCaratteristica = CHARACTERISTIC_FORZA_STRING;
else if(pos!=null && pos ==1)
tipoCaratteristica = CHARACTERISTIC_TEMPERATURA_STRING;
listaDati = db.fetchSensorData(tipoCaratteristica);
if(listaDati== null || listaDati.size() == 0){
listaDati = new LinkedList<SensorData>();
SensorData s = new SensorData("NESSUN ELEMENTO MEMORIZZATO");
listaDati.add(s);
}
adapter.getLista().clear();
adapter.getLista().addAll(listaDati);
// fire the event
adapter.notifyDataSetChanged();
}
现在,当我检索特征值时,我有 thid 代码:
@Override
public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
//RECUPERO IL CORPO DEL MESSAGGIO
try{
ByteBuffer buffer = ByteBuffer.wrap(characteristic.getValue()).order(ByteOrder.LITTLE_ENDIAN);
byte[] value=buffer.array();
int valore1 = new Integer(value[3]) * 256 + new Integer(value[2]);
int valore2 = new Integer(value[5]) * 256 + new Integer(value[4]);
int valore3 = new Integer(value[7]) * 256 + new Integer(value[6]);
int valore4 = new Integer(value[9]) * 256 + new Integer(value[8]);
int valore5 = new Integer(value[11]) * 256 + new Integer(value[10]);
int valore6 = new Integer(value[13]) * 256 + new Integer(value[12]);
int valore7 = new Integer(value[15]) * 256 + new Integer(value[14]);
int valore8 = new Integer(value[17]) * 256 + new Integer(value[16]);
SensorData mSenData = new SensorData(contatore,valore1+"",valore2+"",valore3+"",
valore4+"",valore5+"",valore6+"",valore7+"",valore8+"",
Constants.CHARACTERISTIC_FORZA_STRING,
db.getDateTime(true));
mSenData.setValueTimestamp(db.getDateTime(true));
refreshListView(mSenData);
db.insertSensorData(mSenData);
}catch(Exception e){
Log.e(TAG, e.getMessage());
}
}
在这个方法中我有 refreshListView 方法,我传递给它,新的 SensorData 对象。方法是这样的:
public void refreshListView(SensorData newRelevation) {
adapter.getLista().add(0,newRelevation);
adapter.notifyDataSetChanged();
}
但是如果我尝试启动这段代码,我没有任何错误但列表视图不会自动刷新。
假设我每 5 到 10 毫秒收到一个新值。
【问题讨论】:
-
您的 BLE 设备是否通知特性已更改?
-
通过 Ble 流媒体
-
你试过调试吗?它会触发
onCharacteristicChanged吗? -
是的,数据已正确存储在我的数据库中
-
您可能应该在 UI 线程上调用
refreshListView。我不确定在哪个线程上调用onCharacteristicChanged
标签: android listview bluetooth-lowenergy