• Kotlin中实现RecyclerView嵌套RecyclerView


    实现如图的功能:

     

    1、添加Gson依赖

    implementation 'com.google.code.gson:gson:2.8.7'
    

     使用 viewBinding ,在build.gradle中 android 下配置如下

    // Android Studio 3.6
    android {
        viewBinding {
            enabled = true
        }
    }
     
    // Android Studio 4.0
    android {
        buildFeatures {
            viewBinding = true
        }
    }
    

      

    2、数据

     

    {
      "listdata": [
        {
          "day": "07",
          "mounth": "06月",
          "week": "星期一",
          "data": [
            {
              "time": "01:10",
              "temp": "温度27.1℃"
            },
            {
              "time": "01:20",
              "temp": "温度26.1℃"
            },
            {
              "time": "01:30",
              "temp": "温度25.1℃"
            },
            {
              "time": "01:40",
              "temp": "温度24.1℃"
            }
          ]
        },
        {
          "day": "08",
          "mounth": "06月",
          "week": "星期二",
          "data": [
            {
              "time": "01:10",
              "temp": "温度27.1℃"
            },
            {
              "time": "01:20",
              "temp": "温度26.1℃"
            },
            {
              "time": "01:30",
              "temp": "温度25.1℃"
            },
            {
              "time": "01:40",
              "temp": "温度24.1℃"
            }
          ]
        },
        {
          "day": "09",
          "mounth": "06月",
          "week": "星期三san",
          "data": [
            {
              "time": "01:10",
              "temp": "温度27.1℃"
            },
            {
              "time": "01:20",
              "temp": "温度26.1℃"
            },
            {
              "time": "01:30",
              "temp": "温度25.1℃"
            },
            {
              "time": "01:40",
              "temp": "温度24.1℃"
            }
          ]
        },
        {
          "day": "四10",
          "mounth": "06月",
          "week": "星期si",
          "data": [
            {
              "time": "01:10",
              "temp": "温度27.1℃"
            },
            {
              "time": "01:20",
              "temp": "温度26.1℃"
            },
            {
              "time": "01:30",
              "temp": "温度25.1℃"
            },
            {
              "time": "01:40",
              "temp": "温度24.1℃"
            }
          ]
        },
        {
          "day": "11",
          "mounth": "06月",
          "week": "星期五",
          "data": [
            {
              "time": "01:10",
              "temp": "温度27.1℃"
            },
            {
              "time": "01:20",
              "temp": "温度26.1℃"
            },
            {
              "time": "01:30",
              "temp": "温度25.1℃"
            },
            {
              "time": "01:40",
              "temp": "温度24.1℃"
            }
          ]
        }
      ]
    }
    

      3、数据类 TempBean

    data class TempBean(
        val listdata: List<Listdata>
    )
    
    data class Listdata(
        val `data`: List<Data>,
        val day: String,
        val mounth: String,
        val week: String
    )
    
    data class Data(
        val temp: String,
        val time: String
    )
    

          4、RecycleAdaper

    package com.example.mychartdemo.recycle
    
    import android.content.Context
    import android.util.Log
    import android.view.LayoutInflater
    import android.view.View
    import android.view.ViewGroup
    import android.widget.TextView
    import androidx.recyclerview.widget.LinearLayoutManager
    import androidx.recyclerview.widget.RecyclerView
    import com.example.mychartdemo.R
    
    class RecycleAdaper(var mContext: Context,var textList: MutableList<Listdata>): RecyclerView.Adapter<RecycleAdaper.myViewHolder>() {
    
        init {
            Log.i("打印数据:","${textList[0].day}")
        }
    
    
    
        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): myViewHolder {
            val view = LayoutInflater.from(parent.context).inflate(R.layout.recycle_item_view,parent,false)
            return myViewHolder(view)
        }
    
        override fun onBindViewHolder(holder: myViewHolder, position: Int) {
            var listdata = textList[position]
            Log.i("打印数据:","${listdata.day}")
            holder.day_tv.text = listdata.day
            holder.month_tv.text = listdata.mounth
            holder.week_tv.text = listdata.week
    
            var dataList:MutableList<Data> = listdata.data as MutableList<Data>
    
            val layoutManager = LinearLayoutManager(mContext)
            holder.recyclerview2.layoutManager = layoutManager
            var itemAdaper = ItemAdapter(dataList)
            holder.recyclerview2.adapter = itemAdaper
        }
    
        override fun getItemCount(): Int {
            Log.i("打印数据:","${textList.size}")
            return textList?.size ?:0
        }
    
        class myViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){
            val day_tv: TextView = itemView.findViewById(R.id.day_tv)
            val month_tv: TextView = itemView.findViewById(R.id.month_tv)
            val week_tv: TextView = itemView.findViewById(R.id.week_tv)
            val recyclerview2: RecyclerView = itemView.findViewById(R.id.recyclerview2)
        }
    
    }
    

      5、recycle_item_view 布局文件

    <?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:orientation="vertical">
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="80dp"
            android:orientation="horizontal">
            <TextView
                android:layout_width="60dp"
                android:layout_height="match_parent"
                android:text="07"
                android:textColor="#000000"
                android:textSize="28sp"
                android:gravity="center"
                android:id="@+id/day_tv"></TextView>
            <TextView
                android:layout_width="60dp"
                android:layout_height="match_parent"
                android:text="07"
                android:textColor="#959595"
                android:textSize="14sp"
                android:gravity="center"
                android:layout_marginTop="10dp"
                android:id="@+id/month_tv"></TextView>
            <TextView
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="match_parent"
                android:text="星期一"
                android:textColor="#959595"
                android:textSize="14sp"
                android:gravity="center|right"
                android:layout_marginTop="10dp"
                android:layout_marginRight="20dp"
                android:id="@+id/week_tv"></TextView>
        </LinearLayout>
        <androidx.recyclerview.widget.RecyclerView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/recyclerview2"></androidx.recyclerview.widget.RecyclerView>
    
    </LinearLayout>
    

      6、内部 ItemAdapter 适配器

    package com.example.mychartdemo.recycle
    
    import android.opengl.Visibility
    import android.view.LayoutInflater
    import android.view.View
    import android.view.ViewGroup
    import android.widget.TextView
    import androidx.recyclerview.widget.RecyclerView
    import com.example.mychartdemo.R
    
    class ItemAdapter(private val mutableList: MutableList<Data>) : RecyclerView.Adapter<ItemAdapter.ViewHolder>(){
    
        class ViewHolder(itemView: View): RecyclerView.ViewHolder(itemView){
            val temp_tv: TextView = itemView.findViewById(R.id.temp_tv)
            val time_tv: TextView = itemView.findViewById(R.id.time_tv)
            val top_view: View = itemView.findViewById(R.id.top_view)
            val bottom_view: View = itemView.findViewById(R.id.bottom_view)
    
        }
    
        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
            var view = LayoutInflater.from(parent.context).inflate(R.layout.itme_view,parent,false)
            return ViewHolder(view)
        }
    
        override fun onBindViewHolder(holder: ViewHolder, position: Int) {
            var data = mutableList[position]
            holder.temp_tv.text = data.temp
            holder.time_tv.text = data.time
    
            if (position == 0){
                holder.top_view.visibility = View.INVISIBLE
            }
            if (position == (mutableList.size -1)){
                holder.bottom_view.visibility = View.INVISIBLE
            }
    
    
        }
    
        override fun getItemCount(): Int {
            return mutableList.size
        }
    }
    

      7、内部布局文件 itme_view

    <?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="60dp"
            android:orientation="horizontal">
            <LinearLayout
                android:layout_width="80dp"
                android:layout_height="match_parent"
                android:orientation="vertical"
                android:gravity="center">
                <View
                    android:layout_width="2dp"
                    android:layout_height="20dp"
                    android:background="#DEDEDE"
                    android:id="@+id/top_view"></View>
                <View
                    android:layout_width="20dp"
                    android:layout_height="20dp"
                    android:background="@drawable/circle_bg"></View>
                <View
                    android:layout_width="2dp"
                    android:layout_height="20dp"
                    android:background="#DEDEDE"
                    android:id="@+id/bottom_view"></View>
    
            </LinearLayout>
            <TextView
                android:layout_width="80dp"
                android:layout_height="match_parent"
                android:text="19:51"
                android:textSize="14sp"
                android:textColor="#313131"
                android:gravity="center"
                android:id="@+id/time_tv"></TextView>
            <TextView
                android:layout_width="100dp"
                android:layout_height="match_parent"
                android:text="温度 27.1 ℃"
                android:textSize="14sp"
                android:textColor="#313131"
                android:gravity="center"
                android:id="@+id/temp_tv"></TextView>
        </LinearLayout>
    
    </LinearLayout>
    

      8、小圆圈文件 circle_bg.xml  放在drawable文件夹下

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle">
        <!--填充色-->
        <!--<solid android:color="#FF409DFE"></solid>-->
        <solid android:color="#DDDDDD"></solid>
    
        <!-- 矩形的边线 -->
        <!--<stroke android:color="#DDDDDD"
            android:width="1dp"></stroke>-->
    
        <!--圆角大小-->
        <corners
            android:bottomRightRadius="10dp"
            android:topRightRadius="10dp"
            android:topLeftRadius="10dp"
            android:bottomLeftRadius="10dp"
            ></corners>
        <!--android:radius="10dp"-->
    
        <!--android:topLeftRadius="7dp"
        android:bottomLeftRadius="7dp"-->
    </shape>
    

      9、MainActivity布局文件

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity7">
    
        <androidx.recyclerview.widget.RecyclerView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/recyclerview"></androidx.recyclerview.widget.RecyclerView>
    
    </LinearLayout>
    

      10、MainActivity文件

    package com.example.mychartdemo
    
    import androidx.appcompat.app.AppCompatActivity
    import android.os.Bundle
    import android.util.Log
    import androidx.recyclerview.widget.LinearLayoutManager
    import com.example.mychartdemo.databinding.ActivityMain7Binding
    import com.example.mychartdemo.recycle.Data
    import com.example.mychartdemo.recycle.Listdata
    import com.example.mychartdemo.recycle.RecycleAdaper
    import com.example.mychartdemo.recycle.TempBean
    import com.google.gson.Gson
    import com.google.gson.reflect.TypeToken as TypeToken1
    
    class MainActivity7 : AppCompatActivity() {
        private lateinit var binding: ActivityMain7Binding
        private var listdatalist: MutableList<Listdata> = ArrayList()
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            binding = ActivityMain7Binding.inflate(layoutInflater)
            setContentView(binding.root)
    
    
            initData2()
    
        }
    
        private fun initView() {
    
            Log.i("打印集合2:",""+listdatalist.toString())
            val layoutManager = LinearLayoutManager(this)
            binding.recyclerview.layoutManager = layoutManager
            var recycleAdaper = RecycleAdaper(this,listdatalist)
            binding.recyclerview.adapter = recycleAdaper
        }
    
        private fun initData2(){
            val string = "" //自行复制json数据
           /* var gson: Gson = Gson()
            val tempBean = gson.fromJson(string,TempBean::class.java)
            listdatalist = tempBean.listdata as MutableList<Listdata>
    
            initView()*/
    
    
            val str = ""  //自行复制json数据
    
    
            var gson: Gson = Gson()
            val type = object : TypeToken1<MutableList<Listdata>>(){}.type
            listdatalist = gson.fromJson(str,type)
            //listdatalist = tempBean.listdata as MutableList<Listdata>
    
            initView()
        }
    
        private fun initData() {
            var data1List: MutableList<Data> = ArrayList()
            var data1: Data = Data("温度27.1℃","01:10")
            var data2: Data = Data("温度27.2℃","01:20")
            var data3: Data = Data("温度27.3℃","01:30")
            var data4: Data = Data("温度27.4℃","01:40")
            var data5: Data = Data("温度27.5℃","01:50")
            var data6: Data = Data("温度27.5℃","01:50")
            data1List.add(data1)
            data1List.add(data2)
            data1List.add(data3)
            data1List.add(data4)
            data1List.add(data5)
            data1List.add(data6)
            Log.i("打印:",""+data1List[0].temp)
            var listdata1: Listdata = Listdata(data1List,"07","06月","星期一")
    
    
            var data2List: MutableList<Data> = ArrayList()
            var data21: Data = Data("温度27.1℃","02:10")
            var data22: Data = Data("温度27.2℃","02:20")
            var data23: Data = Data("温度27.3℃","02:30")
            var data24: Data = Data("温度27.4℃","02:40")
            var data25: Data = Data("温度27.5℃","02:50")
            var data26: Data = Data("温度27.5℃","02:50")
            data2List.add(data21)
            data2List.add(data22)
            data2List.add(data23)
            data2List.add(data24)
            data2List.add(data25)
            data2List.add(data26)
            var listdata2: Listdata = Listdata(data2List,"08","06月","星期二")
    
            var data3List: MutableList<Data> = ArrayList()
            var data31: Data = Data("温度27.1℃","03:10")
            var data32: Data = Data("温度27.2℃","03:20")
            var data33: Data = Data("温度27.3℃","03:30")
            var data34: Data = Data("温度27.4℃","03:40")
            var data35: Data = Data("温度27.5℃","03:50")
            var data36: Data = Data("温度27.5℃","03:50")
            data3List.add(data31)
            data3List.add(data32)
            data3List.add(data33)
            data3List.add(data34)
            data3List.add(data35)
            data3List.add(data36)
            var listdata3: Listdata = Listdata(data3List,"09","06月","星期三")
    
            var data4List: MutableList<Data> = ArrayList()
            var data41: Data = Data("温度27.1℃","04:10")
            var data42: Data = Data("温度27.2℃","04:20")
            var data43: Data = Data("温度27.3℃","04:30")
            var data44: Data = Data("温度27.4℃","04:40")
            var data45: Data = Data("温度27.5℃","04:50")
            var data46: Data = Data("温度27.5℃","04:50")
            data4List.add(data41)
            data4List.add(data42)
            data4List.add(data43)
            data4List.add(data44)
            data4List.add(data45)
            data4List.add(data46)
            var listdata4: Listdata = Listdata(data4List,"10","06月","星期四")
    
            listdatalist.add(listdata1)
            listdatalist.add(listdata2)
            listdatalist.add(listdata3)
            listdatalist.add(listdata4)
            Log.i("打印集合:",""+listdatalist.toString())
    
            initView()
        }
    }
    

      

     

  • 相关阅读:
    MVC学习笔记(六)---遇到的小问题汇总
    C# 手写将对象转换为Json方法
    C# 使用SuperSocket
    C#生成/调用动态链接库
    Winform串口编程---接收数据demo(VSPD虚拟串口)
    js获取浏览器内核判断终端(是QQ打开还是QQ浏览器打开)
    工具函数(获取url , 时间格式化,随机数)
    node和npm的安装和镜像源的修改
    atom常用插件
    查看并关闭端口号
  • 原文地址:https://www.cnblogs.com/changyiqiang/p/14894673.html
Copyright © 2020-2023  润新知