首页 文章 精选 留言 我的

精选列表

搜索[鸿蒙课程],共8158篇文章
优秀的个人博客,低调大师

9.kotlin安卓实践课程-用kotlin写第一个fragment的recyclerView的adapter具体实现

简介 主要会通过安卓实战来讲解kotlin语法和实际应用,本教程设及知识点包括框架模式mvp+mvvm, Databinding(数据绑定框架),Dagger2(依赖注入框架),DeepLink(页面路由框架),Rxjava,RxAndroid(异步操作框架),Retrofit,Okhtttp等,不过本教程重点在kotlin所以这些框架需要了解可自行百度。 针对人群:Android中级以上,kotlin入门 本系列最后一篇我们看看recyclerView的adapter怎么实现的 首先先看一下代码 /** * Created by bigman on 18-05-18. */ class AndroidAdapter(private val mList: List<AndroidBean>) :BaseBindingAdapter<ItemAndroidBinding>() { override fun getItemCount(): Int { return mList.size } override fun onBindViewHolder(holder: DataBoundViewHolder<ItemAndroidBinding>, position: Int) { super.onBindViewHolder(holder, position) //数据绑定 holder.binding.androidbean = mList[position] //数据立即绑定而不是在下一帧的时候才绑定,避免闪烁和数据错乱 holder.binding.executePendingBindings() } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DataBoundViewHolder<ItemAndroidBinding> { return DataBoundViewHolder( ItemAndroidBinding.inflate(LayoutInflater.from(parent.context), parent, false)) } } 首先看主构造函数和继承 class AndroidAdapter(private val mList: List<AndroidBean>) :BaseBindingAdapter<ItemAndroidBinding>() 主构造函数传入一个List<AndroidBean>类型的mList只读变量 继承至BaseBindingAdapter<ItemAndroidBinding>() 下一步我们看一下基类BaseBindingAdapter的具体实现 /** * Created by bigman on 18-05-18. */ abstract class BaseBindingAdapter<B : ViewDataBinding> : RecyclerView.Adapter<DataBoundViewHolder<B>>() { var mListener: ((pos: Int) -> Unit)? = null override fun onBindViewHolder(holder: DataBoundViewHolder<B>, position: Int) { holder.binding.root.setOnClickListener { mListener?.invoke(holder.adapterPosition) } } fun setOnItemClickListener(listener: ((pos: Int) -> Unit)) { mListener = listener } } 大家可以看到BaseBindingAdapter需要传入ViewDataBinding类型,这个ViewDataBinding是databinding里面所有视图bingding类的基类, 然后毫无疑问它必须继承于RecyclerView.Adapter<DataBoundViewHolder<B>>,这个我们平时写java的RecyclerView.Adapter的时候都需要继承的 这里还有一个DataBoundViewHolder<B>,看一下代码实现 /** * Created by bigman on 18-05-18. */ class DataBoundViewHolder<T : ViewDataBinding>(val binding:T) : RecyclerView.ViewHolder(binding.root) { } 其实它就是一个RecyclerView.ViewHolder,只是这里我们传入了通用的ViewDataBinding使它变成可以绑定任意视图 回到BaseBindingAdapter,这个基类主要功能就是实现一个通用的databinding用的适配器,只要传入databinding视图类型即可,类内部提供了一个点击事件的回调方法 然后再回到AndroidAdapter 这里主要由三个方法, getItemCount ()返回绑定列表长度, onBindViewHolder ()实现视图数据绑定,这里用的databingding的数据绑定,holder.binding.executePendingBindings(),这句代码比较重要不加可能导致数据错乱或者页面闪烁 onCreateViewHolder()主要是完成databinding的holder构建 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DataBoundViewHolder<ItemAndroidBinding> { return DataBoundViewHolder( ItemAndroidBinding.inflate(LayoutInflater.from(parent.context), parent, false)) } 这里的 ItemAndroidBinding是databinding根据我们的布局文件自动生成的,我们看一下我们这个列表条目布局代码,名称item_android.xml注意对比databinding生成的binding类名称 <?xml version="1.0" encoding="utf-8"?> <layout xmlns:app="http://schemas.android.com/apk/res-auto"> <data> <import type="android.view.View" /> <variable name="androidbean" type="com.bigman.kotlin.bean.AndroidBean" /> </data> <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_marginLeft="2dp" android:layout_marginRight="2dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:background="#fff" android:orientation="vertical" app:cardCornerRadius="5dp" android:paddingTop="10dp"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:orientation="vertical" android:paddingLeft="16dp" android:paddingBottom="10dp" android:paddingRight="16dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{androidbean.desc}" android:textColor="#000" android:textSize="16sp" /> <ImageView android:layout_width="match_parent" android:layout_height="200dp" android:layout_marginTop="10dp" android:scaleType="center" android:visibility="@{androidbean.hasImg()?View.VISIBLE:View.GONE}" app:load_image="@{androidbean.images[0]}" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:layout_marginTop="10dp" android:text="@{androidbean.who}" android:layout_weight="1" android:layout_width="0dp" android:layout_height="wrap_content" /> <TextView android:layout_marginTop="10dp" android:text = "@{androidbean.create()}" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> </LinearLayout> </android.support.v7.widget.CardView> </layout> 具体代码和前面说过的布局没啥太大区别,主要就是data数据的传入和数据绑定 眼神比较犀利的同学可能会看到几个比较不一样的地方而存在疑惑,我们看看是哪里 <ImageView android:layout_width="match_parent" android:layout_height="200dp" android:layout_marginTop="10dp" android:scaleType="center" android:visibility="@{androidbean.hasImg()?View.VISIBLE:View.GONE}" app:load_image="@{androidbean.images[0]}" /> 这里的app:load_image这是''databinding允许的一个函数绑定形式 我们看一下具体实现: /** * Created by bigman on 18-05-18. */ @BindingAdapter("load_image") fun loadImage(imageView: ImageView, url: String?) = Glide.with(imageView.context).load(url) .crossFade() .into(imageView) @BindingAdapter("set_text") fun setText(textView: TextView, string: String) { textView.setText("bigman" + string) } @BindingAdapter("load_asset") fun loadAsset(imageView: ImageView, id: Int) = Glide.with(imageView.context).load(id).into(imageView) 这几个函数被我卸载随意的一个kt文件里面,然后通过 @BindingAdapter注解,我们的databinding框架就能很容易的找到它 那么我们这一系列kotlin 安卓实战内容到这里结束了,虽然kotlin知识点讲的不错,但是基本的运用知道这些也差不多够了,大家可以自己动手写一下,本系列主要目的已经达到,就是kotlin在这种mvp+mvvm目前最合理框架上的具体应用 欢迎一起交流,有问题加群交流 kotlin实战交流群群二维码.png

优秀的个人博客,低调大师

Android官方开发文档Training系列课程中文版:电池续航时间优化之按需开启广播接收器

原文地址:http://android.xsoftlab.net/training/monitoring-device-state/manifest-receivers.html 监测设备状态变化最简单的实现方式就是为每种状态都创建一个广播接收器,然后只需在相应的广播接收器内依据当前的设备状态重新执行各自的任务即可。 这种方式的不好之处就在于每次广播接收器被触发后,APP都会唤醒设备。 一种比较好的解决方案就是在运行时关闭或开启广播接收器。这样也可以使在清单文件中声明的广播接收器按需触发。 动态开启广播接收器 我们可以通过PackageManager将清单文件中声明过的任何组件切换到开启\关闭状态,其中也包括你将要开启或者关闭的广播接收器: ComponentName receiver = new ComponentName(context, myReceiver.class); PackageManager pm = context.getPackageManager(); pm.setComponentEnabledSetting(receiver, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP) 通过使用这种方法,如果发现网络连接已经断开,那么就可以关闭所有的相关广播接收器,除了监听连接变化的广播接收器之外。反之,一旦连接到网络,那么则应当停止网络变化的监听:只需要在执行网络任务之前,检查一下是否有网络连接即可。 你也可以使用这种方式推迟那种需要超大带宽的网络任务。只需要监听一下网络连接的变化即可,一旦连接到Wi-Fi,那则可以开始进行网络下载。

优秀的个人博客,低调大师

Android官方开发文档Training系列课程中文版:电池续航时间优化之检查、检测网络连接状态

原文地址:http://android.xsoftlab.net/training/monitoring-device-state/connectivity-monitoring.html 通常会有一些后台服务需要连接到网络来更新数据。但是如果没有连接到互联网,或者由于网络太慢而不能完成更新,那么为什么不在连接到网络后或在状况良好时再做这些工作呢? 你可以使用ConnectivityManager来检查是否已经连接到互联网,如果连接上了,还可以查询当前的网络连接类型。 检测是否联网 如果没有连接到网络,那么就没必要做基于网络的更新了。下面的代码演示了如何通过ConnectivityManager来检查当前的设备是否连接到了网络。 ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); boolean isConnected = activeNetwork != null && activeNetwork.isConnectedOrConnecting(); 检测当前的网络连接类型 有时可能需要检查当前的网络连接类型。 移动设备的网络可能是蜂窝数据、WiMAX、Wi-Fi或以太网络提供。可以通过查询获知当前的网络连接类型,并基于当前的可用带宽来变更应用的刷新频率。 boolean isWiFi = activeNetwork.getType() == ConnectivityManager.TYPE_WIFI; 移动数据所花费的成本要明显的高于Wi-Fi,所以在大多数情况下,当处于移动数据连接时,应当降低更新频率。类似的,较大文件的下载也应当暂停,直到连接到Wi-Fi网络后再继续下载。 因为会中断某些网络任务,所以监听网络状况变化这一点就变得尤为重要了:以便可以在良好的网络状况下恢复任务。 监听网络连接的变化 当网络状况发生变化时,ConnectivityManager会广播一个CONNECTIVITY_ACTION (“android.net.conn.CONNECTIVITY_CHANGE”)的消息。你可以在清单文件中注册一个专门用于监听此消息的广播接收器,以便恢复或暂停后台网络任务。 <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> 由于设备的网络连接会时常发生变化,所以该广播接收器会在每次切换到移动数据或者Wi-Fi情况下会被触发。因此,最好是为了恢复更新或者下载才用此种方法。通常的做法是,在开始任务之前检查一下网络的连接状况,如果网络不允许,那么使用该方法以便恢复。 这项方法需要动态开启广播接收器,具体的讲解会在下节课描述。

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册