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

零蚀
[🔗 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)
    <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。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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"
        >
    
        <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>
    
    • 除此之外我们也可以自己添加一些功能,比如图上显示的专场动画等等。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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)
        }
    
        // 构建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()){
            }
        })
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

零蚀zero eclipse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值