Skip to content

Commit

Permalink
improved ui performance with recyclerviews
Browse files Browse the repository at this point in the history
  • Loading branch information
simondankelmann committed Jan 4, 2024
1 parent 56c1244 commit d30693d
Show file tree
Hide file tree
Showing 5 changed files with 143 additions and 13 deletions.
Original file line number Diff line number Diff line change
@@ -1,15 +1,19 @@
package de.simon.dankelmann.bluetoothlespam.Adapters

import android.app.Activity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import de.simon.dankelmann.bluetoothlespam.Enums.FlipperDeviceType
import de.simon.dankelmann.bluetoothlespam.Models.FlipperDeviceScanResult
import de.simon.dankelmann.bluetoothlespam.Models.SpamPackageScanResult
import de.simon.dankelmann.bluetoothlespam.R

/*
class FlipperDeviceScanResultListViewAdapter(private val context: Activity, var flipperDevices: MutableList<FlipperDeviceScanResult>) : ArrayAdapter<FlipperDeviceScanResult>(context, R.layout.list_item_flipper_device_scan_result, flipperDevices) {
override fun getView(position: Int, view: View?, parent: ViewGroup): View {
val inflater = context.layoutInflater
Expand All @@ -35,4 +39,44 @@ class FlipperDeviceScanResultListViewAdapter(private val context: Activity, var
return rowView
}
}*/

class FlipperDeviceScanResultListViewAdapter(var mList: MutableList<FlipperDeviceScanResult>) : RecyclerView.Adapter<FlipperDeviceScanResultListViewAdapter.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
// inflates the card_view_design view
// that is used to hold list item
val view = LayoutInflater.from(parent.context).inflate(R.layout.list_item_flipper_device_scan_result, parent, false)
return ViewHolder(view)
}

// binds the list items to a view
override fun onBindViewHolder(holder: ViewHolder, position: Int) {

val ItemsViewModel = mList[position]

holder.nameText.text = ItemsViewModel.deviceName
holder.addressText.text = ItemsViewModel.address
holder.rssiText.text = "${ItemsViewModel.rssi} dBm"

holder.deviceTypeText.text = when(ItemsViewModel.flipperDeviceType){
FlipperDeviceType.FLIPPER_ZERO_WHITE -> "Flipper Zero White"
FlipperDeviceType.FLIPPER_ZERO_BLACK -> "Flipper Zero Black"
FlipperDeviceType.FLIPPER_ZERO_TRANSPARENT -> "Flipper ZeroTransparent"
FlipperDeviceType.UNKNOWN -> "Unknown Flipper Zero"
}
}

// return the number of the items in the list
override fun getItemCount(): Int {
return mList.size
}

// Holds the views for adding it to image and text
class ViewHolder(ItemView: View) : RecyclerView.ViewHolder(ItemView) {
val nameText = ItemView.findViewById(R.id.list_item_flipper_device_scan_result_name) as TextView
val addressText = ItemView.findViewById(R.id.list_item_flipper_device_scan_result_address) as TextView
val rssiText = ItemView.findViewById(R.id.list_item_flipper_device_scan_result_rssi) as TextView
val deviceTypeText = ItemView.findViewById(R.id.list_item_flipper_device_scan_result_deviceType) as TextView
}
}

Original file line number Diff line number Diff line change
@@ -1,16 +1,21 @@
package de.simon.dankelmann.bluetoothlespam.Adapters

import android.annotation.SuppressLint
import android.app.Activity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import de.simon.dankelmann.bluetoothlespam.Enums.FlipperDeviceType
import de.simon.dankelmann.bluetoothlespam.Models.FlipperDeviceScanResult
import de.simon.dankelmann.bluetoothlespam.Models.SpamPackageScanResult
import de.simon.dankelmann.bluetoothlespam.R


/*
class SpamPackageScanResultListViewAdapter(private val context: Activity, var spamPackages: MutableList<SpamPackageScanResult>) : ArrayAdapter<SpamPackageScanResult>(context, R.layout.list_item_spam_package_scan_result, spamPackages) {
override fun getView(position: Int, view: View?, parent: ViewGroup): View {
val inflater = context.layoutInflater
Expand All @@ -29,3 +34,38 @@ class SpamPackageScanResultListViewAdapter(private val context: Activity, var sp
return rowView
}
}
*/

class SpamPackageScanResultListViewAdapter(var mList: MutableList<SpamPackageScanResult>) : RecyclerView.Adapter<SpamPackageScanResultListViewAdapter.ViewHolder>() {
// create new views
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
// inflates the card_view_design view
// that is used to hold list item
val view = LayoutInflater.from(parent.context).inflate(R.layout.list_item_spam_package_scan_result, parent, false)
return ViewHolder(view)
}

// binds the list items to a view
override fun onBindViewHolder(holder: ViewHolder, position: Int) {

val ItemsViewModel = mList[position]

holder.nameText.text = ItemsViewModel.spamPackageType.toString()
holder.addressText.text = ItemsViewModel.address
holder.rssiText.text = "${ItemsViewModel.rssi} dBm"
holder.deviceTypeText.text = "-"
}

// return the number of the items in the list
override fun getItemCount(): Int {
return mList.size
}

// Holds the views for adding it to image and text
class ViewHolder(ItemView: View) : RecyclerView.ViewHolder(ItemView) {
val nameText = ItemView.findViewById(R.id.list_item_spam_package_scan_result_name) as TextView
val addressText = ItemView.findViewById(R.id.list_item_spam_package_scan_result_address) as TextView
val rssiText = ItemView.findViewById(R.id.list_item_spam_package_scan_result_rssi) as TextView
val deviceTypeText = ItemView.findViewById(R.id.list_item_spam_package_scan_result_deviceType) as TextView
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,12 @@ class BluetoothLeScanService () : IBluetoothLeScanService, ScanCallback() {
f0Device.deviceName = "TestItem: ${i}"
f0Device.address = i.toString()
// Dont let it disappear
f0Device.lastSeen = LocalDateTime.now().plusWeeks(1)
_flipperDevicesList.add(f0Device)
}*/
}
*/
}

// Cleanup Flipper Device List
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ import android.view.View
import android.view.ViewGroup
import android.widget.ExpandableListView
import android.widget.ListView
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import de.simon.dankelmann.bluetoothlespam.Adapters.AdvertisementSetCollectionExpandableListViewAdapter
import de.simon.dankelmann.bluetoothlespam.Adapters.FlipperDeviceScanResultListViewAdapter
import de.simon.dankelmann.bluetoothlespam.Adapters.SpamPackageScanResultListViewAdapter
Expand All @@ -34,11 +36,21 @@ class SpamDetectorFragment : IBluetoothLeScanCallback, Fragment() {
private var _viewModel: SpamDetectorViewModel? = null
private var _binding: FragmentSpamDetectorBinding? = null


/*
private lateinit var _flipperDevicesListView: ListView
private lateinit var _flipperDevicesListViewAdapter: FlipperDeviceScanResultListViewAdapter
private lateinit var _spamPackageListView: ListView
private lateinit var _spamPackageListViewAdapter: SpamPackageScanResultListViewAdapter
*/

private lateinit var _flipperDevicesRecyclerView: RecyclerView
private lateinit var _flipperDevicesListViewAdapter: FlipperDeviceScanResultListViewAdapter

private lateinit var _spamPackageRecyclerView: RecyclerView
private lateinit var _spamPackageListViewAdapter: SpamPackageScanResultListViewAdapter


companion object {
fun newInstance() = SpamDetectorFragment()
Expand Down Expand Up @@ -72,8 +84,8 @@ class SpamDetectorFragment : IBluetoothLeScanCallback, Fragment() {
_binding = FragmentSpamDetectorBinding.inflate(inflater, container, false)
val root: View = _binding!!.root

_flipperDevicesListView = _binding!!.spamDetectionFlipperDevicesList
_spamPackageListView = _binding!!.spamDetectionSpamPackageList
_flipperDevicesRecyclerView = _binding!!.spamDetectionFlipperDevicesList
_spamPackageRecyclerView = _binding!!.spamDetectionSpamPackageList

setupUi()
setupFlipperDevicesListView()
Expand Down Expand Up @@ -110,9 +122,13 @@ class SpamDetectorFragment : IBluetoothLeScanCallback, Fragment() {
}

fun setupFlipperDevicesListView(){
_flipperDevicesListViewAdapter = FlipperDeviceScanResultListViewAdapter(AppContext.getBluetoothLeScanService().getFlipperDevicesList())
_flipperDevicesRecyclerView.adapter = _flipperDevicesListViewAdapter
_flipperDevicesRecyclerView.layoutManager = LinearLayoutManager(AppContext.getActivity())
/*
_flipperDevicesListViewAdapter = FlipperDeviceScanResultListViewAdapter(requireActivity(), AppContext.getBluetoothLeScanService().getFlipperDevicesList())
_flipperDevicesListView.isScrollingCacheEnabled = true
_flipperDevicesListView.adapter = _flipperDevicesListViewAdapter
_flipperDevicesListView.adapter = _flipperDevicesListViewAdapter*/
/*
listView.setOnItemClickListener(){adapterView, view, position, id ->
// Maybe later...
Expand All @@ -121,9 +137,14 @@ class SpamDetectorFragment : IBluetoothLeScanCallback, Fragment() {
}

fun setupSpamPackagesListView(){
_spamPackageListViewAdapter = SpamPackageScanResultListViewAdapter(AppContext.getBluetoothLeScanService().getSpamPackageScanResultList())
_spamPackageRecyclerView.adapter = _spamPackageListViewAdapter
_spamPackageRecyclerView.layoutManager = LinearLayoutManager(AppContext.getActivity())

/*
_spamPackageListViewAdapter = SpamPackageScanResultListViewAdapter(requireActivity(), AppContext.getBluetoothLeScanService().getSpamPackageScanResultList())
_spamPackageListView.isScrollingCacheEnabled = true
_spamPackageListView.adapter = _spamPackageListViewAdapter
_spamPackageListView.adapter = _spamPackageListViewAdapter*/
/*
listView.setOnItemClickListener(){adapterView, view, position, id ->
// Maybe later...
Expand All @@ -136,19 +157,19 @@ class SpamDetectorFragment : IBluetoothLeScanCallback, Fragment() {
var newItems = AppContext.getBluetoothLeScanService().getFlipperDevicesList()
newItems.forEach { newFlipperDevice ->
var oldFlipperListIndex = -1
_flipperDevicesListViewAdapter.flipperDevices.forEachIndexed { index, oldFlipperDevice ->
_flipperDevicesListViewAdapter.mList.forEachIndexed { index, oldFlipperDevice ->
if(oldFlipperDevice.address == newFlipperDevice.address){
oldFlipperListIndex = index
}
}

if(oldFlipperListIndex != -1){
// Update
_flipperDevicesListViewAdapter.flipperDevices[oldFlipperListIndex] = newFlipperDevice
_flipperDevicesListViewAdapter.mList[oldFlipperListIndex] = newFlipperDevice
//Log.d(_logTag, "Updated existing Item")
} else {
// Add
_flipperDevicesListViewAdapter.flipperDevices.add(newFlipperDevice)
_flipperDevicesListViewAdapter.mList.add(newFlipperDevice)
//Log.d(_logTag, "Created existing Item")
}
}
Expand All @@ -162,18 +183,19 @@ class SpamDetectorFragment : IBluetoothLeScanCallback, Fragment() {
var newItems = AppContext.getBluetoothLeScanService().getSpamPackageScanResultList()
newItems.forEach { newSpamPackage ->
var oldListIndex = -1
_spamPackageListViewAdapter.spamPackages.forEachIndexed { index, oldSpamPackage ->

_spamPackageListViewAdapter.mList.forEachIndexed { index, oldSpamPackage ->
if(oldSpamPackage.address == newSpamPackage.address){
oldListIndex = index
}
}

if(oldListIndex != -1){
// Update
_spamPackageListViewAdapter.spamPackages[oldListIndex] = newSpamPackage
_spamPackageListViewAdapter.mList[oldListIndex] = newSpamPackage
} else {
// Add
_spamPackageListViewAdapter.spamPackages.add(newSpamPackage)
_spamPackageListViewAdapter.mList.add(newSpamPackage)
}
}

Expand Down
24 changes: 22 additions & 2 deletions app/src/main/res/layout/fragment_spam_detector.xml
Original file line number Diff line number Diff line change
Expand Up @@ -86,12 +86,22 @@
>
</TextView>

<!--
<ListView
android:id="@+id/spamDetectionFlipperDevicesList"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintTop_toBottomOf="@id/spamDetectorFlipperListTitle"
app:layout_constraintBottom_toBottomOf="@id/spamDetectorCenterLayout"/>
app:layout_constraintBottom_toBottomOf="@id/spamDetectorCenterLayout"/>-->

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/spamDetectionFlipperDevicesList"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintTop_toBottomOf="@id/spamDetectorFlipperListTitle"
app:layout_constraintBottom_toBottomOf="@id/spamDetectorCenterLayout"
tools:itemCount="1"
tools:listitem="@layout/list_item_flipper_device_scan_result" />

</androidx.constraintlayout.widget.ConstraintLayout>

Expand All @@ -114,12 +124,22 @@
app:layout_constraintTop_toTopOf="@id/spamDetectorBottomLayout" >
</TextView>

<!--
<ListView
android:id="@+id/spamDetectionSpamPackageList"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintTop_toBottomOf="@id/spamDetectorSpamListTitle"
app:layout_constraintBottom_toBottomOf="@id/spamDetectorBottomLayout"/>
app:layout_constraintBottom_toBottomOf="@id/spamDetectorBottomLayout"/>-->

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/spamDetectionSpamPackageList"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintTop_toBottomOf="@id/spamDetectorSpamListTitle"
app:layout_constraintBottom_toBottomOf="@id/spamDetectorBottomLayout"
tools:itemCount="1"
tools:listitem="@layout/list_item_spam_package_scan_result" />

</androidx.constraintlayout.widget.ConstraintLayout>

Expand Down

0 comments on commit d30693d

Please sign in to comment.