当前位置: 首页 > news >正文

博物馆 网站 建设昆山网站设计公司

博物馆 网站 建设,昆山网站设计公司,上海市建设工程交易服务中心,wordpress 文件夹管理Ble蓝牙App#xff08;三#xff09;特性使用 前言正文一、获取属性列表二、属性适配器三、获取特性名称四、特性适配器五、加载特性六、显示特性和属性七、源码 前言 在上一篇中我们完成了连接和发现服务两个动作#xff0c;那么再发现服务之后要做什么呢#xff1f;发现服… Ble蓝牙App三特性使用 前言正文一、获取属性列表二、属性适配器三、获取特性名称四、特性适配器五、加载特性六、显示特性和属性七、源码 前言 在上一篇中我们完成了连接和发现服务两个动作那么再发现服务之后要做什么呢发现服务只是让你知道设备有什么服务可以做什么事情。 正文 本篇要做的是显示服务下的特性首先我们了解一下特性的基本知识。在蓝牙低功耗BLE中特性Characteristic是蓝牙设备提供的一种数据单元用于描述设备的某个属性或功能。特性包含了一系列的属性和值可以用于读取、写入和通知数据。 BLE特性相关的关键概念和说明 UUIDUniversally Unique Identifier每个特性都会有一个唯一的UUID用于标识该特性。值Value特性包含一个值可以是字节数组、字符串或其他数据类型。该值代表特性的当前状态或数据内容。属性Properties特性具有一组属性包括读、写、通知等。属性决定了可以对特性进行哪些操作。读Read允许外部设备从特性中读取当前的值。写Write允许外部设备向特性写入一个新的值。通知Notify当特性的值发生变化时可以通过通知方式将新的值发送给订阅该特性的外部设备。描述符Descriptor特性可以附带一个或多个描述符用于提供关于特性的额外信息或配置。 使用BLE特性可以实现各种功能和数据交互例如传感器数据的读取、设备状态的监控、远程控制等。特性的读写和通知操作可以通过与蓝牙设备的交互来实现。需要注意的是BLE特性的操作和功能是由设备的厂商定义的并在设备的GATTGeneric Attribute Profile配置文件中进行描述。 首先理清一下思路我们现在知道服务下面有特性特性下面有一些属性值其中属性Properties尤为重要因为它决定了你的特性可以进行那些操作。用一个图来说明服务特性属性之间的关系。 一、获取属性列表 下面我们先获取最下面的属性这是一个列表属性值的处理有一些不同首先我们在BleUtils中增加一个函数代码如下所示 /*** 获取属性*/fun getProperties(property: Int): ListString {val properties: MutableListString ArrayList()for (i in 0..7) {when (property and (1 shl i)) {0x01 - properties.add(Broadcast)0x02 - properties.add(Read)0x04 - properties.add(Write No Response)0x08 - properties.add(Write)0x10 - properties.add(Notify)0x20 - properties.add(Indicate)0x40 - properties.add(Authenticated Signed Writes)0x80 - properties.add(Extended Properties)}}return properties}这里是通过位运算进行计算属性的值首先是循环遍历shl 是一种位运算符用于执行按位左移操作。shl 是 “shift left” 的缩写。and用于执行按位与操作。先左移再按位与得到最终的值根据值得到属性描述这些描述就是具体的功能操作。会返回一个属性列表有了列表我们就可以写一个适配器了。 二、属性适配器 首先我们在layout下创建一个item_property.xml代码如下所示 ?xml version1.0 encodingutf-8? TextView xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:idid/tv_propertyandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_marginEnd8dpandroid:textpropertyandroid:textColorcolor/orange /因为是String类型所以我们就直接用一个TextView显示即可下面我们写适配器在adapter包下新建一个PropertyAdapter类代码如下所示 class PropertyAdapter(private val properties: ListString,private val listener: OnItemClickListener ) : RecyclerView.AdapterPropertyAdapter.ViewHolder() {override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {return ViewHolder(ItemPropertyBinding.inflate(LayoutInflater.from(parent.context), parent, false)).apply {binding.tvProperty.setOnClickListener { v - listener.onItemClick(v, adapterPosition) }}}override fun onBindViewHolder(holder: ViewHolder, position: Int) {holder.binding.tvProperty.text properties[position]}override fun getItemCount() properties.sizeclass ViewHolder(itemView: ItemPropertyBinding) : RecyclerView.ViewHolder(itemView.root) {var binding: ItemPropertyBindinginit {binding itemView}} }这里进行了属性的点击监听我们可以回调到特性适配器中去处理下面我们要处理的就是特性了。 三、获取特性名称 首先是特性名称同样是根据UUID同样是那个PDF文档在BleUtils中增加一个getCharacteristicsName()函数代码有点多如下所示 /*** 获取特性名称* param uuid UUID*/fun getCharacteristicsName(uuid: UUID) when (0x${uuid.toString().substring(4, 8).uppercase(Locale.getDefault())}) {0x2A00 - Device Name0x2A01 - Appearance0x2A02 - Peripheral Privacy Flag0x2A03 - Reconnection Address0x2A04 - Peripheral Preferred Connection Parameters0x2A05 - Service Changed0x2A06 - Alert Level0x2A07 - Tx Power Level0x2A08 - Date Time0x2A09 - Day of Week0x2A0A - Day Date Time0x2A0C - Exact Time 2560x2A0D - DST Offset0x2A0E - Time Zone0x2A0F - Local Time Information0x2A11 - Time with DST0x2A12 - Time Accuracy0x2A13 - Time Source0x2A14 - Reference Time Information0x2A16 - Time Update Control Point0x2A17 - Time Update State0x2A18 - Glucose Measurement0x2A19 - Battery Level0x2A1C - Temperature Measurement0x2A1D - Temperature Type0x2A1E - Intermediate Temperature0x2A21 - Measurement Interval0x2A22 - Boot Keyboard Input Report0x2A23 - System ID0x2A24 - Model Number String0x2A25 - Serial Number String0x2A26 - Firmware Revision String0x2A27 - Hardware Revision String0x2A28 - Software Revision String0x2A29 - Manufacturer Name String0x2A2A - IEEE 11073-20601 Regulatory Certification Data List0x2A2B - Current Time0x2A2C - Magnetic Declination0x2A31 - Scan Refresh0x2A32 - Boot Keyboard Output Report0x2A33 - Boot Mouse Input Report0x2A34 - Glucose Measurement Context0x2A35 - Blood Pressure Measurement0x2A36 - Intermediate Cuff Pressure0x2A37 - Heart Rate Measurement0x2A38 - Body Sensor Location0x2A39 - Heart Rate Control Point0x2A3F - Alert Status0x2A40 - Ringer Control Point0x2A41 - Ringer Setting0x2A42 - Alert Category ID Bit Mask0x2A43 - Alert Category ID0x2A44 - Alert Notification Control Point0x2A45 - Unread Alert Status0x2A46 - New Alert0x2A47 - Supported New Alert Category0x2A48 - Supported Unread Alert Category0x2A49 - Blood Pressure Feature0x2A4A - HID Information0x2A4B - Report Map0x2A4C - HID Control Point0x2A4D - Report0x2A4E - Protocol Mode0x2A4F - Scan Interval Window0x2A50 - PnP ID0x2A51 - Glucose Feature0x2A52 - Record Access Control Point0x2A53 - RSC Measurement0x2A54 - RSC Feature0x2A55 - SC Control Point0x2A5A - Aggregate0x2A5B - CSC Measurement0x2A5C - CSC Feature0x2A5D - Sensor Location0x2A5E - PLX Spot-Check Measurement0x2A5F - PLX Continuous Measurement0x2A60 - PLX Features0x2A63 - Cycling Power Measurement0x2A64 - Cycling Power Vector0x2A65 - Cycling Power Feature0x2A66 - Cycling Power Control Point0x2A67 - Location and Speed0x2A68 - Navigation0x2A69 - Position Quality0x2A6A - LN Feature0x2A6B - LN Control Point0x2A6C - Elevation0x2A6D - Pressure0x2A6E - Temperature0x2A6F - Humidity0x2A70 - True Wind Speed0x2A71 - True Wind Direction0x2A72 - Apparent Wind Speed0x2A73 - Apparent Wind Direction0x2A74 - Gust Factor0x2A75 - Pollen Concentration0x2A76 - UV Index0x2A77 - Irradiance0x2A78 - Rainfall0x2A79 - Wind Chill0x2A7A - Heat Index0x2A7B - Dew Point0x2A7D - Descriptor Value Changed0x2A7E - Aerobic Heart Rate Lower Limit0x2A7F - Aerobic Threshold0x2A80 - Age0x2A81 - Anaerobic Heart Rate Lower Limit0x2A82 - Anaerobic Heart Rate Upper Limit0x2A83 - Anaerobic Threshold0x2A84 - Aerobic Heart Rate Upper Limit0x2A85 - Date of Birth0x2A86 - Date of Threshold Assessment0x2A87 - Email Address0x2A88 - Fat Burn Heart Rate Lower Limit0x2A89 - Fat Burn Heart Rate Upper Limit0x2A8A - First Name0x2A8B - Five Zone Heart Rate Limits0x2A8C - Gender0x2A8D - Heart Rate Max0x2A8E - Height0x2A8F - Hip Circumference0x2A90 - Last Name0x2A91 - Maximum Recommended Heart Rate0x2A92 - Resting Heart Rate0x2A93 - Sport Type for Aerobic and Anaerobic Thresholds0x2A94 - Three Zone Heart Rate Limits0x2A95 - Two Zone Heart Rate Limits0x2A96 - VO2 Max0x2A97 - Waist Circumference0x2A98 - Weight0x2A99 - Database Change Increment0x2A9A - User Index0x2A9B - Body Composition Feature0x2A9C - Body Composition Measurement0x2A9D - Weight Measurement0x2A9E - Weight Scale Feature0x2A9F - User Control Point0x2AA0 - Magnetic Flux Density - 2D0x2AA1 - Magnetic Flux Density - 3D0x2AA2 - Language0x2AA3 - Barometric Pressure Trend0x2AA4 - Bond Management Control Point0x2AA5 - Bond Management Feature0x2AA6 - Central Address Resolution0x2AA7 - CGM Measurement0x2AA8 - CGM Feature0x2AA9 - CGM Status0x2AAA - CGM Session Start Time0x2AAB - CGM Session Run Time0x2AAC - CGM Specific Ops Control Point0x2AAD - Indoor Positioning Configuration0x2AAE - Latitude0x2AAF - Longitude0x2AB0 - Local North Coordinate0x2AB1 - Local East Coordinate0x2AB2 - Floor Number0x2AB3 - Altitude0x2AB4 - Uncertainty0x2AB5 - Location Name0x2AB6 - URI0x2AB7 - HTTP Headers0x2AB8 - HTTP Status Code0x2AB9 - HTTP Entity Body0x2ABA - HTTP Control Point0x2ABB - HTTPS Security0x2ABC - TDS Control Point0x2ABD - OTS Feature0x2ABE - Object Name0x2ABF - Object Type0x2AC0 - Object Size0x2AC1 - Object First -Created0x2AC2 - Object Last - Modified0x2AC3 - Object ID0x2AC4 - Object Properties0x2AC5 - Object Action Control Point0x2AC6 - Object List Control Point0x2AC7 - Object List Filter0x2AC8 - Object Changed0x2AC9 - Resolvable Private Address Only0x2ACC - Fitness Machine Feature0x2ACD - Treadmill Data0x2ACE - Cross Trainer Data0x2ACF - Step Climber Data0x2AD0 - Stair Climber Data0x2AD1 - Rower Data0x2AD2 - Indoor Bike Data0x2AD3 - Training Status0x2AD4 - Supported Speed Range0x2AD5 - Supported Inclination Range0x2AD6 - Supported Resistance Level Range0x2AD7 - Supported Heart Rate Range0x2AD8 - Supported Power Range0x2AD9 - Fitness Machine Control Point0x2ADA - Fitness Machine Status0x2ADB - Mesh Provisioning Data In0x2ADC - Mesh Provisioning Data Out0x2ADD - Mesh Proxy Data In0x2ADE - Mesh Proxy Data Out0x2AE0 - Average Current0x2AE1 - Average Voltage0x2AE2 - Boolean0x2AE3 - Chromatic Distance from Planckian0x2AE4 - Chromaticity Coordinates0x2AE5 - Chromaticity in CCT and Duv Values0x2AE6 - Chromaticity Tolerance0x2AE7 - CIE 13.3 - 1995 Color Rendering Index0x2AE8 - Coefficient0x2AE9 - Correlated Color Temperature0x2AEA - Count 160x2AEB - Count 240x2AEC - Country Code0x2AED - Date UTC0x2AEE - Electric Current0x2AEF - Electric Current Range0x2AF0 - Electric Current Specification0x2AF1 - Electric Current Statistics0x2AF2 - Energy0x2AF3 - Energy in a Period of Day0x2AF4 - Event Statistics0x2AF5 - Fixed String 160x2AF6 - Fixed String 240x2AF7 - Fixed String 360x2AF8 - Fixed String 80x2AF9 - Generic Level0x2AFA - Global Trade Item Number0x2AFB - Illuminance0x2AFC - Luminous Efficacy0x2AFD - Luminous Energy0x2AFE - Luminous Exposure0x2AFF - Luminous Flux0x2B00 - Luminous Flux Range0x2B01 - Luminous Intensity0x2B02 - Mass Flow0x2B03 - Perceived Lightness0x2B04 - Percentage 80x2B05 - Power0x2B06 - Power Specification0x2B07 - Relative Runtime in a Current Range0x2B08 - Relative Runtime in a Generic Level Range0x2B09 - Relative Value in a Voltage Range0x2B0A - Relative Value in an Illuminance Range0x2B0B - Relative Value in a Period of Day0x2B0C - Relative Value in a Temperature Range0x2B0D - Temperature 80x2B0E - Temperature 8 in a Period of Day0x2B0F - Temperature 8 Statistics0x2B10 - Temperature Range0x2B11 - Temperature Statistics0x2B12 - Time Decihour 80x2B13 - Time Exponential 80x2B14 - Time Hour 240x2B15 - Time Millisecond 240x2B16 - Time Second 160x2B17 - Time Second 80x2B18 - Voltage0x2B19 - Voltage Specification0x2B1A - Voltage Statistics0x2B1B - Volume Flow0x2B1C - Chromaticity Coordinate0x2B1D - RC Feature0x2B1E - RC Settings0x2B1F - Reconnection Configuration Control Point0x2B20 - IDD Status Changed0x2B21 - IDD Status0x2B22 - IDD Annunciation Status0x2B23 - IDD Features0x2B24 - IDD Status Reader Control Point0x2B25 - IDD Command Control Point0x2B26 - IDD Command Data0x2B27 - IDD Record Access Control Point0x2B28 - IDD History Data0x2B29 - Client Supported Features0x2B2A - Database Hash0x2B2B - BSS Control Point0x2B2C - BSS Response0x2B2D - Emergency ID0x2B2E - Emergency Text0x2B2F - ACS Status0x2B30 - ACS Data In0x2B31 - ACS Data Out Notify0x2B32 - ACS Data Out Indicate0x2B33 - ACS Control Point0x2B34 - Enhanced Blood Pressure Measurement0x2B35 - Enhanced Intermediate Cuff Pressure0x2B36 - Blood Pressure Record0x2B37 - Registered User0x2B38 - BR - EDR Handover Data0x2B39 - Bluetooth SIG Data0x2B3A - Server Supported Features0x2B3B - Physical Activity Monitor Features0x2B3C - General Activity Instantaneous Data0x2B3D - General Activity Summary Data0x2B3E - CardioRespiratory Activity Instantaneous Data0x2B3F - CardioRespiratory Activity Summary Data0x2B40 - Step Counter Activity Summary Data0x2B41 - Sleep Activity Instantaneous Data0x2B42 - Sleep Activity Summary Data0x2B43 - Physical Activity Monitor Control Point0x2B44 - Activity Current Session0x2B45 - Physical Activity Session Descriptor0x2B46 - Preferred Units0x2B47 - High Resolution Height0x2B48 - Middle Name0x2B49 - Stride Length0x2B4A - Handedness0x2B4B - Device Wearing Position0x2B4C - Four Zone Heart Rate Limits0x2B4D - High Intensity Exercise Threshold0x2B4E - Activity Goal0x2B4F - Sedentary Interval Notification0x2B50 - Caloric Intake0x2B51 - TMAP Role0x2B77 - Audio Input State0x2B78 - Gain Settings Attribute0x2B79 - Audio Input Type0x2B7A - Audio Input Status0x2B7B - Audio Input Control Point0x2B7C - Audio Input Description0x2B7D - Volume State0x2B7E - Volume Control Point0x2B7F - Volume Flags0x2B80 - Volume Offset State0x2B81 - Audio Location0x2B82 - Volume Offset Control Point0x2B83 - Audio Output Description0x2B84 - Set Identity Resolving Key0x2B85 - Coordinated Set Size0x2B86 - Set Member Lock0x2B87 - Set Member Rank0x2B88 - Encrypted Data Key Material0x2B89 - Apparent Energy 320x2B8A - Apparent Power0x2B8B - Live Health Observations0x2B8C - CO \\{} text-subscript { 2 } Concentration0x2B8D - Cosine of the Angle0x2B8E - Device Time Feature0x2B8F - Device Time Parameters0x2B90 - Device Time0x2B91 - Device Time Control Point0x2B92 - Time Change Log Data0x2B93 - Media Player Name0x2B94 - Media Player Icon Object ID0x2B95 - Media Player Icon URL0x2B96 - Track Changed0x2B97 - Track Title0x2B98 - Track Duration0x2B99 - Track Position0x2B9A - Playback Speed0x2B9B - Seeking Speed0x2B9C - Current Track Segments Object ID0x2B9D - Current Track Object ID0x2B9E - Next Track Object ID0x2B9F - Parent Group Object ID0x2BA0 - Current Group Object ID0x2BA1 - Playing Order0x2BA2 - Playing Orders Supported0x2BA3 - Media State0x2BA4 - Media Control Point0x2BA5 - Media Control Point Opcodes Supported0x2BA6 - Search Results Object ID0x2BA7 - Search Control Point0x2BA8 - Energy 320x2BA9 - Media Player Icon Object Type0x2BAA - Track Segments Object Type0x2BAB - Track Object Type0x2BAC - Group Object Type0x2BAD - Constant Tone Extension Enable0x2BAE - Advertising Constant Tone Extension Minimum Length0x2BAF - Advertising Constant Tone Extension Minimum Transmit Count0x2BB0 - Advertising Constant Tone Extension Transmit Duration0x2BB1 - Advertising Constant Tone Extension Interval0x2BB2 - Advertising Constant Tone Extension PHY0x2BB3 - Bearer Provider Name0x2BB4 - Bearer UCI0x2BB5 - Bearer Technology0x2BB6 - Bearer URI Schemes Supported List0x2BB7 - Bearer Signal Strength0x2BB8 - Bearer Signal Strength Reporting Interval0x2BB9 - Bearer List Current Calls0x2BBA - Content Control ID0x2BBB - Status Flags0x2BBC - Incoming Call Target Bearer URI0x2BBD - Call State0x2BBE - Call Control Point0x2BBF - Call Control Point Optional Opcodes0x2BC0 - Termination Reason0x2BC1 - Incoming Call0x2BC2 - Call Friendly Name0x2BC3 - Mute0x2BC4 - Sink ASE0x2BC5 - Source ASE0x2BC6 - ASE Control Point0x2BC7 - Broadcast Audio Scan Control Point0x2BC8 - Broadcast Receive State0x2BC9 - Sink PAC0x2BCA - Sink Audio Locations0x2BCB - Source PAC0x2BCC - Source Audio Locations0x2BCD - Available Audio Contexts0x2BCE - Supported Audio Contexts0x2BCF - Ammonia Concentration0x2BD0 - Carbon Monoxide Concentration0x2BD1 - Methane Concentration0x2BD2 - Nitrogen Dioxide Concentration0x2BD3 - Non -Methane Volatile Organic Compounds Concentration0x2BD4 - Ozone Concentration0x2BD5 - Particulate Matter - PM1 Concentration0x2BD6 - Particulate Matter - PM2.5 Concentration0x2BD7 - Particulate Matter - PM10 Concentration0x2BD8 - Sulfur Dioxide Concentration0x2BD9 - Sulfur Hexafluoride Concentration0x2BDA - Hearing Aid Features0x2BDB - Hearing Aid Preset Control Point0x2BDC - Active Preset Index0x2BDD - Stored Health Observations0x2BDE - Fixed String 640x2BDF - High Temperature0x2BE0 - High Voltage0x2BE1 - Light Distribution0x2BE2 - Light Output0x2BE3 - Light Source Type0x2BE4 - Noise0x2BE5 - Relative Runtime in a Correlated Color Temperature Range0x2BE6 - Time Second 320x2BE7 - VOC Concentration0x2BE8 - Voltage Frequency0x2BE9 - Battery Critical Status0x2BEA - Battery Health Status0x2BEB - Battery Health Information0x2BEC - Battery Information0x2BED - Battery Level Status0x2BEE - Battery Time Status0x2BEF - Estimated Service Date0x2BF0 - Battery Energy Status0x2BF1 - Observation Schedule Changed0x2BF2 - Current Elapsed Time0x2BF3 - Health Sensor Features0x2BF4 - GHS Control Point0x2BF5 - LE GATT Security Levels0x2BF6 - ESL Address0x2BF7 - AP Sync Key Material0x2BF8 - ESL Response Key Material0x2BF9 - ESL Current Absolute Time0x2BFA - ESL Display Information0x2BFB - ESL Image Information0x2BFC - ESL Sensor Information0x2BFD - ESL LED Information0x2BFE - ESL Control Point0x2BFF - UDI for Medical Deviceselse - Unknown Characteristics}同修改一下原有的getServiceUUID()为getShortUUID()只改名字而已之前命名有点不太严谨。 四、特性适配器 首先我们在layout下创建一个item_characteristic.xml代码如下所示 ?xml version1.0 encodingutf-8? androidx.constraintlayout.widget.ConstraintLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:layout_marginBottom1dpandroid:foreground?attr/selectableItemBackgroundandroid:paddingStart16dpTextViewandroid:idid/tv_character_nameandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_marginTop8dpandroid:text特性android:textColorcolor/blackandroid:textSize16spandroid:textStyleboldapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfparent /TextViewandroid:idid/tv_uuid_titleandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:textUUIDapp:layout_constraintStart_toStartOfid/tv_character_nameapp:layout_constraintTop_toBottomOfid/tv_character_name /TextViewandroid:idid/tv_character_uuidandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:textUUIDandroid:textColorcolor/blackapp:layout_constraintBottom_toBottomOfid/tv_uuid_titleapp:layout_constraintStart_toEndOfid/tv_uuid_titleapp:layout_constraintTop_toTopOfid/tv_uuid_title /TextViewandroid:idid/tv_property_titleandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_marginBottom8dpandroid:textPropertiesapp:layout_constraintBottom_toBottomOfparentapp:layout_constraintStart_toStartOfid/tv_character_nameapp:layout_constraintTop_toBottomOfid/tv_uuid_title /androidx.recyclerview.widget.RecyclerViewandroid:idid/rv_propertyandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentapp:layout_constraintBottom_toBottomOfid/tv_property_titleapp:layout_constraintStart_toEndOfid/tv_property_titleapp:layout_constraintTop_toTopOfid/tv_property_title //androidx.constraintlayout.widget.ConstraintLayout这里显示特性的名称和UUIID同时加载属性列表然后写适配器因为需要操作属性的缘故这些写一个接口在adapter包下新建一个OperateCallback接口代码如下所示 interface OperateCallback {/*** 属性操作*/fun onPropertyOperate(characteristic: BluetoothGattCharacteristic, operateName: String) }通过这个接口可以知道当前操作的是那个特性和属性名称。下面我们写适配器在adapter包下新建一个CharacteristicAdapter类代码如下所示 class CharacteristicAdapter(private val characteristics: ListBluetoothGattCharacteristic,private val callback: OperateCallback ) : RecyclerView.AdapterCharacteristicAdapter.ViewHolder() {override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {return ViewHolder(ItemCharacteristicBinding.inflate(LayoutInflater.from(parent.context), parent, false))}override fun onBindViewHolder(holder: ViewHolder, position: Int) {holder.binding.tvCharacterName.text BleUtils.getCharacteristicsName(characteristics[position].uuid)holder.binding.tvCharacterUuid.text BleUtils.getShortUUID(characteristics[position].uuid)//加载特性下的属性holder.binding.rvProperty.apply {layoutManager LinearLayoutManager(context).apply { orientation LinearLayoutManager.HORIZONTAL }val properties: ListString BleUtils.getProperties(characteristics[position].properties)adapter PropertyAdapter(properties, object : OnItemClickListener {//点击属性override fun onItemClick(view: View?, position: Int) { callback.onPropertyOperate(characteristics[position], properties[position]) }})}}override fun getItemCount() characteristics.sizeclass ViewHolder(itemView: ItemCharacteristicBinding) : RecyclerView.ViewHolder(itemView.root) {var binding: ItemCharacteristicBindinginit {binding itemView}} }在这里我们就可以处理特性的名称和UUID显示同时加载属性适配器显示出来。 五、加载特性 因为特性是在服务下的所以我们可以在服务适配器中加载特性适配器。首先我们修改一下item_service.xml代码如下所示 ?xml version1.0 encodingutf-8? LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoandroid:layout_widthmatch_parentandroid:orientationverticalandroid:backgroundcolor/whiteandroid:layout_heightwrap_contentandroidx.constraintlayout.widget.ConstraintLayoutandroid:idid/item_serviceandroid:layout_widthmatch_parentandroid:foreground?attr/selectableItemBackgroundandroid:layout_heightwrap_contentandroid:orientationverticalTextViewandroid:idid/tv_service_nameandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_marginStart16dpandroid:layout_marginTop8dpandroid:text服务android:textColorcolor/blackandroid:textSize16spandroid:textStyleboldapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfparent /TextViewandroid:idid/tv_uuid_titleandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:textUUIDapp:layout_constraintStart_toStartOfid/tv_service_nameapp:layout_constraintTop_toBottomOfid/tv_service_name /TextViewandroid:idid/tv_service_uuidandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:textUUIDandroid:textColorcolor/blackapp:layout_constraintBottom_toBottomOfid/tv_uuid_titleapp:layout_constraintStart_toEndOfid/tv_uuid_titleapp:layout_constraintTop_toTopOfid/tv_uuid_title /TextViewandroid:idid/tv_service_infoandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_marginBottom8dpandroid:textPRIMARY SERVICEapp:layout_constraintBottom_toBottomOfparentapp:layout_constraintStart_toStartOfid/tv_service_nameapp:layout_constraintTop_toBottomOfid/tv_uuid_title /ImageViewandroid:idid/iv_stateandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_marginEnd16dpapp:layout_constraintBottom_toBottomOfparentapp:layout_constraintEnd_toEndOfparentapp:layout_constraintTop_toTopOfparentapp:srcCompatdrawable/ic_right_24 //androidx.constraintlayout.widget.ConstraintLayoutandroidx.recyclerview.widget.RecyclerViewandroid:idid/rv_characteristicsandroid:visibilitygoneandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:paddingStart16dp / /LinearLayout整体上变化不大只是加了一个RecyclerView同时增加了一个ImageView用于显示当前的服务是否展开可以通过当前的服务item的方式控制是否显示特性列表这里用到两个图标在drawable下创建ic_right_24.xml代码如下所示 vector xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:width24dpandroid:height24dpandroid:tint#000000android:viewportWidth24android:viewportHeight24pathandroid:fillColorandroid:color/whiteandroid:pathDataM10,17l5,-5 -5,-5v10z / /vector还有一个ic_down_24.xml vector xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:width24dpandroid:height24dpandroid:tint#000000android:viewportWidth24android:viewportHeight24pathandroid:fillColorandroid:color/whiteandroid:pathDataM7,10l5,5 5,-5z / /vector下面修改一下ServiceAdapter代码如下所示 class ServiceAdapter(private val services: ListBluetoothGattService,private val callback: OperateCallback ) : RecyclerView.AdapterServiceAdapter.ViewHolder() {override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {val viewHolder ViewHolder(ItemServiceBinding.inflate(LayoutInflater.from(parent.context), parent, false))viewHolder.binding.itemService.setOnClickListener {//显示特性列表viewHolder.binding.rvCharacteristics.visibility if (viewHolder.binding.rvCharacteristics.visibility View.VISIBLE) View.GONE else View.VISIBLE//更换图标viewHolder.binding.ivState.setImageDrawable(if (viewHolder.binding.rvCharacteristics.visibility View.VISIBLE) ContextCompat.getDrawable(parent.context, R.drawable.ic_down_24)else ContextCompat.getDrawable(parent.context, R.drawable.ic_right_24))}return viewHolder}override fun onBindViewHolder(holder: ViewHolder, position: Int) {holder.binding.tvServiceName.text BleUtils.getServiceName(services[position].uuid)holder.binding.tvServiceUuid.text BleUtils.getShortUUID(services[position].uuid)//加载服务下的特性holder.binding.rvCharacteristics.apply {layoutManager LinearLayoutManager(context)adapter CharacteristicAdapter(services[position].characteristics, callback)}}override fun getItemCount() services.sizeclass ViewHolder(itemView: ItemServiceBinding) : RecyclerView.ViewHolder(itemView.root) {var binding: ItemServiceBindinginit {binding itemView}} }和之前的区别就在于构造的时候增加了一个回调并且在onCreateViewHolder()函数中就处理了服务Item的点击事件而不是像之前一样回调到Activity中在服务Item的点击事件中判断是否显示特性列表同时修改图标资源。最后再将接口回调到Activity中。 六、显示特性和属性 现在要做的就是修改MainActivity中的代码首先修改activity_main.xml中的代码主要是修改之前的rv_service中的属性值修改后如下所示 androidx.recyclerview.widget.RecyclerViewandroid:idid/rv_serviceandroid:layout_widthmatch_parentandroid:layout_height0dpapp:layout_constraintBottom_toBottomOfparentapp:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toBottomOfid/tv_device_info /主要就是让RecyclerView占满剩下的空间避免内容过多导致无法滑动的情况最后我们修改一下MainActivity中代码如下所示 class MainActivity : BaseActivity(), BleCallback, OperateCallback {...override fun onServicesDiscovered(services: ListBluetoothGattService) {runOnUiThread {mServiceList.clear()mServiceList.addAll(services)mServiceAdapter ?: run {mServiceAdapter ServiceAdapter(mServiceList, thisMainActivity)binding.rvService.apply {(itemAnimator as SimpleItemAnimator).supportsChangeAnimations falselayoutManager LinearLayoutManager(thisMainActivity)adapter mServiceAdapter//增加分隔线addItemDecoration(DividerItemDecoration(thisMainActivity, DividerItemDecoration.VERTICAL))}mServiceAdapter}mServiceAdapter!!.notifyDataSetChanged()}}/*** 属性操作*/override fun onPropertyOperate(characteristic: BluetoothGattCharacteristic, operateName: String) {showMsg(operateName)} }修改的地方有三个第一个就是MainActivity实现OnItemClickListener改成OperateCallback 第二个是onServicesDiscovered()函数中构建ServiceAdapter适配器中实现接口然后添加分隔线最后一个就是去掉之前onItemClick()函数改成onPropertyOperate()函数运行一下看看效果。 七、源码 如果对你有所帮助的话不妨 Star 或 Fork山高水长后会有期~ 源码地址GoodBle
http://www.w-s-a.com/news/177414/

相关文章:

  • 做网站的中文名字汕尾网站开发
  • 网站推广效果推广网站推荐
  • 腾讯企业网站建设网络推广比较经典和常用的方法有
  • 四川成都网站网页设计上海外贸网站制作公司
  • wordpress模板首页图片锦州网站做优化
  • 哔哩哔哩网站建设分析有哪些做网站好的公司
  • 福建建设执业中心网站沧州网络推广外包公司
  • 做网站怎么改关键词营销网站建设818gx
  • 广撒网网站怎么进行网络营销
  • 中职计算机网站建设教学计划电商网站如何避免客户信息泄露
  • 惠州微网站建设外贸进出口代理公司
  • 网站建设最常见的问题建设银行网站机构
  • 网站集群建设相关的招标南通seo网站建设费用
  • 网络培训的网站建设能够做二维码网站
  • 网站类游戏网站开发wordpress 文章首标点
  • 徐州网站建设熊掌号免费推广网站入口2020
  • 网站建设有前途长春高铁站
  • 做网站网课阿里云域名查询系统
  • saas建站平台有哪些简述网站建设基本流程答案
  • 个人怎么做网站网站浏览思路
  • 网站建设里的知识长沙网络营销公司
  • 网站建设与维护大作业pc网站转换成微网站
  • php网站开发经典教材东莞网站开发
  • 教育培训手机网站模板下载跨境电商培训哪家最好
  • 网站开发淄博网站被降权会发生什么影响吗
  • 网站开发常用的语言东城手机网站制作
  • 微小店网站建设平台手机优化加速有什么用
  • 沈阳酒店企业网站制作公司竞价网站怎么做seo
  • 中山企业网站多少钱学网站建设的好处
  • 做官网网站哪家公司好jianux wordpress