当前位置: 代码迷 >> 综合 >> NO.2 Jetpeck 基础<Fra导航 ListAdapter>
  详细解决方案

NO.2 Jetpeck 基础<Fra导航 ListAdapter>

热度:5   发布时间:2023-12-15 16:08:56.0

零蚀
[? Jetpack教程基础篇]


目录

? 大纲
? Android 知识栈
? Android Jetpack 系列
? NO.1 Jetpeck 基础<ViewModel & Room>
? NO.3 Jetpeck 基础<Retrofit & WorkManager>


导航组件

  • 简介

    • 导航组件是可以管理复杂的导航,过渡动画,深度链接,以及编译时检查的参数传递的屏幕之间在您的应用程序库。

    • 应用也是很简单的,需要在res中创建navigation文件夹,之后在其中构建xxxx.xml,这就是你fragment导航的逻辑文件。这里需要设置id,用于定位这个文件的逻辑,这里还需要设置起始的fragment的,这个是为了设置刚开始加载的fragment对象。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hAajx36J-1625284455783)(media/16240046889353/16243535951715.jpg)]

    • 这里我们在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。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cBUvo6qZ-1625284455785)(media/16240046889353/16243497681854.jpg)]

    <?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>
    
    • 除此之外我们也可以自己添加一些功能,比如图上显示的专场动画等等。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1ey5gqML-1625284455786)(media/16240046889353/16243522464260.jpg)]

    • 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行为可节省大量处理时间并有助于列表平滑滚动。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-alx741l5-1625284455788)(media/16240046889353/16252828626516.jpg)]

  • 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()){
          }})