Android - 如何正确显示信标列表?
Android - How to display properly a list of beacons?
我正在尝试在列表视图中显示信标及其各自的值。显示列表,但显示 2 个信标实例;例如
UUID:e2c56db5-dffb-48d2-b060-d0f5a71096e0
专业:2
未成年人:236
RSSI:-59
德克萨斯州:-59
距离:0.9449177660225923
在列表视图中显示两次:
UUID:e2c56db5-dffb-48d2-b060-d0f5a71096e0
专业:2
未成年人:236
RSSI:-59
德克萨斯州:-59
距离:0.9449177660225923
UUID:e2c56db5-dffb-48d2-b060-d0f5a71096e0
专业:2
未成年人:236
RSSI:-59
德克萨斯州:-59
距离:0.9449177660225923
我使用的代码如下:
beaconManager.addRangeNotifier(new RangeNotifier() {
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
if (beacons.size() > 0) {
data.clear();
for (Beacon beacon : beacons) {
data.add("UUID: " + beacon.getId1()
+ "\nMAJOR: " + beacon.getId2()
+ "\nMINOR: " + beacon.getId3()
+ "\nRSSI: " + beacon.getRssi()
+ "\nTX: " + beacon.getTxPower()
+ "\nDISTANCE: " + beacon.getDistance());
}
updateList();
}
}
});
updateList()
public void updateList(){
runOnUiThread(new Runnable() {
@Override
public void run() {
adapter.add(data);
}
});
listView
List<String> data = new ArrayList();
listView = (ListView) findViewById(R.id.listView);
adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, data);
listView.setAdapter(adapter);
adapter.notifyDataSetChanged();
可能是因为您在添加新项之前没有清除适配器中的数据
public void updateList(){
runOnUiThread(new Runnable() {
@Override
public void run() {
adapter.clear(); //this should wipe out all existing adapter data
adapter.add(data);
}
});
您的问题是每次找到信标时,您都会将其添加到列表中,而不是将其清除。我想你应该在将新元素添加到列表之前实施某种验证,或者只是删除那里的所有元素,例如:
@Override
public void run() {
adapter.clear();
// element or whatever
adapter.add(element);
}
我使用了以下方法,因为可以连续检测到信标,它对我有用。建议一:避免使用ListView。
for (Beacon beacon : beacons) {
if (!beaconsSeen.contains(beacon)) {
beaconsSeen.add(beacon);
//TODO update ListView/RecyclerView here
}
}
beacons.clear();
beacons.addAll(rangedBeacons);
Collections.sort(beacons, new BeaconComparator());
我正在尝试在列表视图中显示信标及其各自的值。显示列表,但显示 2 个信标实例;例如
UUID:e2c56db5-dffb-48d2-b060-d0f5a71096e0 专业:2 未成年人:236 RSSI:-59 德克萨斯州:-59 距离:0.9449177660225923
在列表视图中显示两次:
UUID:e2c56db5-dffb-48d2-b060-d0f5a71096e0 专业:2 未成年人:236 RSSI:-59 德克萨斯州:-59 距离:0.9449177660225923
UUID:e2c56db5-dffb-48d2-b060-d0f5a71096e0 专业:2 未成年人:236 RSSI:-59 德克萨斯州:-59 距离:0.9449177660225923
我使用的代码如下:
beaconManager.addRangeNotifier(new RangeNotifier() {
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
if (beacons.size() > 0) {
data.clear();
for (Beacon beacon : beacons) {
data.add("UUID: " + beacon.getId1()
+ "\nMAJOR: " + beacon.getId2()
+ "\nMINOR: " + beacon.getId3()
+ "\nRSSI: " + beacon.getRssi()
+ "\nTX: " + beacon.getTxPower()
+ "\nDISTANCE: " + beacon.getDistance());
}
updateList();
}
}
});
updateList()
public void updateList(){
runOnUiThread(new Runnable() {
@Override
public void run() {
adapter.add(data);
}
});
listView
List<String> data = new ArrayList();
listView = (ListView) findViewById(R.id.listView);
adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, data);
listView.setAdapter(adapter);
adapter.notifyDataSetChanged();
可能是因为您在添加新项之前没有清除适配器中的数据
public void updateList(){
runOnUiThread(new Runnable() {
@Override
public void run() {
adapter.clear(); //this should wipe out all existing adapter data
adapter.add(data);
}
});
您的问题是每次找到信标时,您都会将其添加到列表中,而不是将其清除。我想你应该在将新元素添加到列表之前实施某种验证,或者只是删除那里的所有元素,例如:
@Override
public void run() {
adapter.clear();
// element or whatever
adapter.add(element);
}
我使用了以下方法,因为可以连续检测到信标,它对我有用。建议一:避免使用ListView。
for (Beacon beacon : beacons) {
if (!beaconsSeen.contains(beacon)) {
beaconsSeen.add(beacon);
//TODO update ListView/RecyclerView here
}
}
beacons.clear();
beacons.addAll(rangedBeacons);
Collections.sort(beacons, new BeaconComparator());