美文网首页
Kevin Learn Kotlin:Android UI (R

Kevin Learn Kotlin:Android UI (R

作者: Kevin_小飞象 | 来源:发表于2021-12-07 08:27 被阅读0次
    a.jpg

    简介

    RecyclerView 是 Android 中极其重要的一个高级 UI 控件,使用频率非常非常高,App 中 90% 以上的页面都会使用的到。由于其出色的性能和插拔式的架构设计,被全世界广大开发者一致称赞。

    25.png

    准备

    添加 Kotlin 的扩展插件,可以直接使用布局中的控件 id 来操作 view 控件,不再 findViewById()。大大提高工作效率,减少模板代码量。

    1. 在根目录 build.gradle 添加:
    dependencies {
           ...
            classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
        }
    
    1. 在 app/build.gradle 添加:
    plugins {
        ...
        id 'kotlin-android-extensions'
    }
    

    LinearLayoutManager (线性布局)

    1. 效果图

    26.png

    2. 布局文件

    item_fruit.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:orientation="vertical">
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:layout_gravity="center_vertical"
            android:orientation="horizontal">
            <ImageView
                android:id="@+id/iv_fruit"
                android:layout_width="45dp"
                android:layout_height="45dp"
                android:layout_gravity="center_vertical"
                android:layout_marginLeft="12dp"
                android:layout_marginRight="12dp"
                android:src="@mipmap/ic_apple"/>
    
            <TextView
                android:id="@+id/tv_fruit_name"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical"
                android:textColor="@color/black"
                android:textSize="18sp"
                android:textStyle="bold"
                android:text="Apple"
                android:layout_marginLeft="10dp"/>
        </LinearLayout>
    
        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="#F3F3F3"/>
    </LinearLayout>
    

    fragment_home.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".ui.home.HomeFragment">
    
        <TextView
            android:id="@+id/text_home"
            android:layout_width="match_parent"
            android:layout_height="60dp"
            android:background="@color/teal_200"
            android:gravity="center"
            android:textColor="@color/white"
            android:textStyle="bold"
            android:text="LinearLayoutManager 列表布局"
            android:textSize="20sp" />
    
        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/rv_fruit"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    </LinearLayout>
    
    1. kotlin 代码
    class HomeFragment : Fragment(R.layout.fragment_home) {
    
        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
    
            rv_fruit.layoutManager = LinearLayoutManager(context,LinearLayoutManager.VERTICAL,false)
            rv_fruit.adapter = MyAdapter()
        }
    
        inner class MyAdapter : RecyclerView.Adapter<MyViewHolder>(){
            override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
                val itemView = LayoutInflater.from(context)
                    .inflate(R.layout.item_fruit,parent,false)
                return MyViewHolder(itemView)
            }
    
            override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
                // kotlin 三种方式加载图片资源
                holder.itemView.iv_fruit.setImageResource(R.mipmap.ic_apple)
                // context!! 表示context 不为null
                /*holder.itemView.iv_fruit.setImageDrawable(
                    ContextCompat.getDrawable(
                        context!!,
                        R.mipmap.ic_apple
                    )
                )
    
                holder.itemView.iv_fruit.setImageBitmap(
                    BitmapFactory.decodeResource(
                        context!!.resources,
                        R.mipmap.ic_apple
                    )
                )*/
    
                holder.itemView.tv_fruit_name.text = "【${position}】Apple"
            }
    
            override fun getItemCount(): Int {
                return 20
            }
    
        }
    
        class MyViewHolder(view: View) : RecyclerView.ViewHolder(view) {}
    }
    

    GridLayoutManager (网格布局)

    1. 效果图

    27.png

    2. 布局文件

    item_fruit_grid.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/teal_200"
        android:layout_margin="12dp"
        android:orientation="vertical">
    
        <ImageView
            android:id="@+id/iv_fruit"
            android:layout_width="80dp"
            android:layout_height="80dp"
            android:layout_gravity="center_horizontal"
            android:src="@mipmap/ic_apple"/>
    
        <TextView
            android:id="@+id/tv_fruit_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="8dp"
            android:textColor="@color/white"
            android:textSize="16sp"
            android:layout_gravity="center_horizontal"/>
    
    </LinearLayout>
    

    fragment_dashboard.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".ui.dashboard.DashboardFragment">
    
        <TextView
            android:id="@+id/text_home"
            android:layout_width="match_parent"
            android:layout_height="60dp"
            android:background="@color/teal_200"
            android:gravity="center"
            android:textColor="@color/white"
            android:textStyle="bold"
            android:text="GirdLayoutManager 网格布局"
            android:textSize="20sp" />
    
        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/rv_fruit"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    </LinearLayout>
    
    1. kotlin 代码
    class DashboardFragment : Fragment(R.layout.fragment_dashboard) {
        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
    
            rv_fruit.layoutManager = GridLayoutManager(context, 3)
            rv_fruit.adapter = MyAdapter()
        }
    
        inner class MyAdapter : RecyclerView.Adapter<MyViewHolder>(){
            override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
                val itemView = LayoutInflater.from(context)
                    .inflate(R.layout.item_fruit_grid,parent,false)
                return MyViewHolder(itemView)
            }
    
            override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
                holder.itemView.iv_fruit.setImageResource(R.mipmap.ic_apple)
    
                holder.itemView.tv_fruit_name.text = "【${position}】Apple"
            }
    
            override fun getItemCount(): Int {
                return 20
            }
    
        }
    
        class MyViewHolder(view: View) : RecyclerView.ViewHolder(view) {}
    

    相关文章

      网友评论

          本文标题:Kevin Learn Kotlin:Android UI (R

          本文链接:https://www.haomeiwen.com/subject/nerdxrtx.html