零蚀
[🔗 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)
<fragment android: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" > <fragment android:id="@+id/tittleFragment" android:name="com.tg.jetpack.fragments.TittleFragment" android:label="TittleFragment" > <action android:id="@+id/action_tittleFragment_to_gameFragment" app:destination="@id/gameFragment" /> </fragment> <fragment android: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) } // 构建viewHolder open 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) } } } // 创建view override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RvViewHolder { return RvViewHolder.from(parent) } // 绑定view override fun onBindViewHolder(holder: RvViewHolder, position: Int) { val item = getItem(position) holder.bind(item) } }
- listAdapter添加数据的方法只有一个就是
submitList
,但是它添加/改变数据类型必须是MutableList
。
data.observe(owner,{ adapter.submitList(it.toMutableList()){ } })