Advertisement

TrimwebsolutionsTrimwebsolutions

Problem and Solutions

How to create a list from scanned BLE results in android ?

By M.K. Verma · 4 May 2022

How to create a list from scanned BLE results in android ?

You could use the liveData builder to collect the Flow's values into a MutableList.

Here I copy the MutableList using toList() before emitting it since RecyclerView Adapters don't play well with mutable data sources.

val scanResults: LiveData<List<BleScanResult>> = liveData {
    val cumulativeResults = mutableListOf<BleScanResult>()

    scanEnabled.flatMapLatest { doScan ->
        if (doScan) {
            repository.bluetoothScan().map { BleScanResult(it.device.name, it.device.address) }
        } else {
            emptyFlow()
        }
    }.collect {
        cumulativeResults += it
        emit(cumulativeResults.toList())
    }
}

If you want to avoid duplicate entries and reordering of entries, you can use a set like this:

val scanResults: LiveData<List<BleScanResult>> = liveData {
    val cumulativeResults = mutableSetOf<BleScanResult>()

    scanEnabled.flatMapLatest { doScan ->
        if (doScan) {
            repository.bluetoothScan().map { BleScanResult(it.device.name, it.device.address) }
        } else {
            emptyFlow()
        }
    }.collect {
        if (it !in cumulativeResults) {
            cumulativeResults += it
            emit(cumulativeResults.toList())
        }
    }
}