零蚀
[? Jetpack教程基础篇]
目录
? 大纲
? Android 知识栈
? Android Jetpack 系列
? NO.1 Jetpeck 基础<ViewModel & Room>
? NO.3 Jetpeck 基础<Retrofit & WorkManager>
导航组件
-
简介
-
导航组件是可以管理复杂的导航,过渡动画,深度链接,以及编译时检查的参数传递的屏幕之间在您的应用程序库。
-
应用也是很简单的,需要在res中创建
navigation
文件夹,之后在其中构建xxxx.xml,这就是你fragment导航的逻辑文件。这里需要设置id,用于定位这个文件的逻辑,这里还需要设置起始的fragment的,这个是为了设置刚开始加载的fragment对象。
- 这里我们在acitivty的布局文件中添加了对应的fragment,这里指定了流程图示navigate,也指定了是默认持有起始fragment(defaultNavHost)
<fragmentandroid:id="@+id/myNavHostFragment"android:name="androidx.navigation.fragment.NavHostFragment"android:layout_width="match_parent"android:layout_height="match_parent"app:navGraph="@navigation/navigate"app:defaultNavHost="true" />
- 我们可以通过图像上的操作来设置跳转的路径。它会自动生成对应的跳转操作的id。
<?xml version="1.0" encoding="utf-8"?> <navigation xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:id="@+id/navigate"app:startDestination="@id/tittleFragment"><fragmentandroid:id="@+id/tittleFragment"android:name="com.tg.jetpack.fragments.TittleFragment"android:label="TittleFragment" ><actionandroid:id="@+id/action_tittleFragment_to_gameFragment"app:destination="@id/gameFragment" /></fragment><fragmentandroid:id="@+id/gameFragment"android:name="com.tg.jetpack.fragments.GameFragment"android:label="GameFragment" /> </navigation>
- 除此之外我们也可以自己添加一些功能,比如图上显示的专场动画等等。
- tittleFragment中的的跳转逻辑编辑,这里的跳转是通过栈保存的,如果点击返回的话,默认是先pop栈中的fragment而不是销毁activity。
open class TittleFragment : Fragment() { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { val binding = DataBindingUtil.inflate<FraTitleBinding>(inflater,R.layout.fra_title, container, false)binding.txTitleFra.setOnClickListener { it.findNavController().navigate(R.id.action_tittleFragment_to_gameFragment)}return binding.root ;} }
- 这里关于fragment导航其他内容不再详谈。
-
ListAdapter
-
简介
- 默认情况下,RecyclerView仅处理或绘制当前在屏幕上可见的项目。当一个项目滚出屏幕时,项目的视图被回收。这意味着该项目在滚动到屏幕上时充满了新内容。此RecyclerView行为可节省大量处理时间并有助于列表平滑滚动。
-
DiffUtil
- DiffUtil用于计算两个列表之间的差异。从旧列表中进行的最小更改次数以生成新列表,这比重做整个列表要高效得多。(有一点要注意的是,如果在极短的时间内,进行加载的数据里面有相同的数据,diffUtil是不会做区分的,如果adapter已经加载好了,你再进行相同数据的加载,会直接屏蔽掉。)
open class RvAdapter:ListAdapter<TitleData,RvAdapter.RvViewHolder>(RV_DIFF){ companion object { private var RV_DIFF = object:DiffUtil.ItemCallback<TitleData>(){ override fun areItemsTheSame(oldItem: TitleData, newItem: TitleData): Boolean { // 判断两个bean是否是相同,以此来判断是否添加或者覆盖return oldItem.id == newItem.id}override fun areContentsTheSame(oldItem: TitleData, newItem: TitleData): Boolean { // areItemsTheSame是同一个时候是否需要更新return oldItem == newItem}}}override fun submitList(list: MutableList<TitleData>?) { super.submitList(list)}// 构建viewHolderopen class RvViewHolder constructor(val binding:AdapterRvBinding):RecyclerView.ViewHolder(binding.root){ fun bind(data:TitleData){ binding.data = data}companion object{ fun from(parent: ViewGroup):RvViewHolder{ val binding = AdapterRvBinding.inflate(LayoutInflater.from(parent.context),parent,false)return RvViewHolder(binding)}}}// 创建viewoverride fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RvViewHolder { return RvViewHolder.from(parent)}// 绑定viewoverride fun onBindViewHolder(holder: RvViewHolder, position: Int) { val item = getItem(position)holder.bind(item)} }
- listAdapter添加数据的方法只有一个就是
submitList
,但是它添加/改变数据类型必须是MutableList
。
data.observe(owner,{ adapter.submitList(it.toMutableList()){ }})