Android kotlin RecyclerView遍历json实现列表数据的案例

 更新时间:2024年08月02日 10:49:17   作者:代码x手莓莓  
这篇文章主要介绍了Android kotlin RecyclerView遍历json实现列表数据的案例,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

需求

效果图如下 :

这个ui看起来简单, 其实要实现几个功能点
1. json数据的遍历
2. RecyclerView实现循环的列表
3. 每块元素里的元素点击 : 未选中的话, 首次点击显示"selected", 点击"selected"则进行下一步数据处理
4. 设置默认的选择的元素, 显示selected

代码

1. layout/item_region.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="50dp">   // 这里的高度需要注意, 就是每个需要遍历的元素的高度, 千万要写成不match_parent
    <LinearLayout
        android:id="@+id/item_region"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:background="@drawable/bottom_border_white"
        android:gravity="center_vertical">
        <TextView
            android:id="@+id/regionName"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            android:layout_weight="2"
            android:text="China"
            android:textColor="@color/colorPrimary"
            android:textSize="16sp" />
        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="50dp"
            android:layout_weight="1"
            android:gravity="center_vertical"
            android:orientation="horizontal">
            <TextView
                android:id="@+id/selectedBtn"
                android:layout_width="80dp"
                android:layout_height="wrap_content"
                android:text="Selected"
                android:textColor="@color/colorPrimary"
                android:textSize="16sp"
                android:visibility="invisible"
                />
            <ImageView
                android:layout_width="10dp"
                android:layout_height="15dp"
                android:layout_marginLeft="15dp"
                android:src="@drawable/right_arrow" />
        </LinearLayout>
    </LinearLayout>
</LinearLayout>

2. activity_update_region.xml 主页面

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:background="@color/main_bg_color"
    android:orientation="vertical"
    >
    <LinearLayout
        android:id="@+id/updateArea_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="50dp"
            android:layout_marginLeft="20dp"
            android:layout_marginTop="40dp"
            android:gravity="center_vertical"
            android:text="All regions"
            android:textColor="@color/colorPrimary"
            android:textSize="16sp"
            android:textStyle="bold" />
        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/regionListRecyclerView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            />
    </LinearLayout>
</RelativeLayout>

3. Myactivity.kt

import kotlinx.android.synthetic.main.activity_update_area.regionListRecyclerView
data class Country(val name: String, val code: Int, var selected: Boolean)
/**
 * 设置页
 */
class AreaupdateActivity : AppCompatActivity() {
    private lateinit var adapter: SimpleAdapter
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_update_area)
        // 读取文件内容
        val jsonString = loadJsonFromAssets(this, "country.json")
        val gson = Gson()
        val countryName = "China"
        val countrys: List<Country> = gson.fromJson(jsonString, type)
		// 设置默认的被选中的countryName selected 
        if (countryName != null) {
            for (item in countrys) {
                if (item.name == countryName){
                    item.selected = true
                }
            }
        }
        regionListRecyclerView.layoutManager = LinearLayoutManager(this)
        adapter = SimpleAdapter(countrys)
        regionListRecyclerView.adapter = adapter
		// 元素的点击事件
        adapter.setOnItemClickListener(object : SimpleAdapter.OnItemClickListener {
            override fun onItemClick(position: Int, item: Country) {
                println("我点击的$item")
                adapter.notifyItemChanged(position, item) // .indexOf(item)
            }
        })
    }
	// 如果JSON文件位于assets目录下, 这是处理非代码资源文件(如文本、JSON等)的方式。通过AssetManager来访问这些文件。
    fun loadJsonFromAssets(context: Context, fileName: String): String {
        val assetManager = context.assets
        val reader: BufferedReader
        var jsonString: String = ""
        try {
            reader = BufferedReader(InputStreamReader(assetManager.open(fileName)))
            jsonString = reader.use { it.readText() }
        } catch (e: Exception) {
            e.printStackTrace()
            // 处理异常情况
        }
        return jsonString
    }
	// SimpleAdapter 适配器, 监听列表元素
	// 为了代码的优雅, 应该单独写在Adapter里
    class SimpleAdapter(private val countrys: List<Country>) :
        RecyclerView.Adapter<SimpleAdapter.SimpleViewHolder>() {
        private var selectedPosition = RecyclerView.NO_POSITION
        inner class SimpleViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
            val regionName: TextView = itemView.findViewById(R.id.regionName)
            val selectedBtn: TextView = itemView.findViewById(R.id.selectedBtn)
            init {
                itemView.setOnClickListener {
                    // 在这里处理点击事件
                    onItemClickListener?.let { listener ->
                        selectedPosition = adapterPosition
                        notifyDataSetChanged()
                        if (selectedPosition != RecyclerView.NO_POSITION) {
                            listener.onItemClick(selectedPosition, getItem(selectedPosition))
                        }
                    }
                }
            }
        }
        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SimpleViewHolder {
            val view = LayoutInflater.from(parent.context)
                .inflate(R.layout.item_region, parent, false)
            return SimpleViewHolder(view)
        }
        interface OnItemClickListener {
            fun onItemClick(position: Int, item: Country)
        }
        private var onItemClickListener: OnItemClickListener? = null
        fun setOnItemClickListener(listener: OnItemClickListener) {
            onItemClickListener = listener
        }
        override fun onBindViewHolder(holder: SimpleViewHolder, position: Int) {
            val currentItem = getItem(position)
            holder.regionName.text = countrys[position].name
            // 点击的显示selected, 其他隐藏
            holder.selectedBtn.visibility = if (position == selectedPosition) View.VISIBLE else View.INVISIBLE
            // 初始化数据 currentItem.selected为true的显示
            // 点击的时候 原currentItem.selected为true的变为false, 点击的这个元素selected显示
             if (currentItem.selected) {
                 currentItem.selected = !currentItem.selected
                holder.selectedBtn.visibility = View.VISIBLE  
                println("我显示着")
            }
            // 点击selected
            holder.selectedBtn.setOnClickListener {
                var countryStr = currentItem.name
                CoroutineScope(Dispatchers.IO).launch {
                    updateInfo(countryStr) // 更新用户数据(自定义function)
                }
            }
        }
        override fun getItemCount(): Int = countrys.size
        fun getItem(position: Int): Country {
            return countrys[position]
        }
    }
}

4. assets/country.json (示例)

[{
		"selected": false,
		"country_id": 100006,
		"country_code": 244,
		"name": "Angola",
		"country_name_cn": "安哥拉",
		"ab": "AO"
	},
	{
		"selected": false,
		"country_id": 100008,
		"country_code": 355,
		"name": "Albania",
		"country_name_cn": "阿尔巴尼亚",
		"ab": "AL"
	}]

完成!
其中难点是上述第3条功能, 因为需要操作item里的元素, 相比item, 里面的元素更难获取和操作, 其次是selected的初始化和两次点击的操作, 还有点击时其他selected的隐藏

对比uniapp的感受 :
① 组件的适配器和数据监听交给开发者去写, 此为难度一, 而uniapp仅需一个v-for完成遍历
② 点击事件的处理, Android需要开发者自己找到选中的元素及其子元素, 再对其及其兄弟元素操作, 有点类似jquery, 操作dom节点, 而非vue一样操作数据, 逻辑性会更强一些

到此这篇关于Android kotlin RecyclerView遍历json实现列表数据的文章就介绍到这了,更多相关Android kotlin RecyclerView列表数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Android Handler消息传递机制

    Android Handler消息传递机制

    Handler是一套 Android 消息传递机制,主要用于线程间通信。用最简单的话描述: handler其实就是主线程在起了一个子线程,子线程运行并生成Message,Looper获取message并传递给Handler,Handler逐个获取子线程中的Message
    2022-12-12
  • Android中的Activity生命周期总结

    Android中的Activity生命周期总结

    这篇文章主要介绍了Android中的Activity生命周期总结,本文讲解了Activity四大基本状态、Activity七大生命周期函数、切换横竖屏触发的生命周期事件等内容,需要的朋友可以参考下
    2015-03-03
  • 100行Android代码轻松实现带动画柱状图

    100行Android代码轻松实现带动画柱状图

    这篇文章主要教大家通过100行Android代码轻松实现带动画柱状图,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • Android开发中的重力传感器用法实例详解

    Android开发中的重力传感器用法实例详解

    这篇文章主要介绍了Android开发中的重力传感器用法,简单分析了Android重力传感器的基本功能、使用方法,并结合实例形式分析了Android基于重力传感器实现横竖屏切换的相关操作技巧,需要的朋友可以参考下
    2017-11-11
  • Android使用Jetpack WindowManager开发可折叠设备(过程分享)

    Android使用Jetpack WindowManager开发可折叠设备(过程分享)

    这篇文章主要介绍了Android使用Jetpack WindowManager开发可折叠设备,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-11-11
  • Android studio设置指定的签名文件教程

    Android studio设置指定的签名文件教程

    这篇文章主要介绍了Android studio设置指定的签名文件教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • Android自定义webView头部进度加载效果

    Android自定义webView头部进度加载效果

    这篇文章主要介绍了Android自定义webView头部进度加载效果,小编画一条进度线,然后加载webview上面,具体实现代码大家参考下本文
    2017-11-11
  • Android实现EditText输入金额

    Android实现EditText输入金额

    EditText是Android中一个非常实用的控件,有很多InputType,可以来达到不同的输入效果,下面通过实例代码给大家解析android实现edittext输入金额,需要的朋友参考下吧
    2016-12-12
  • Android不显示开机向导和开机气泡问题

    Android不显示开机向导和开机气泡问题

    这篇文章主要介绍了Android不显示开机向导和开机气泡问题,需要的朋友可以参考下
    2019-05-05
  • Flutter 状态管理的实现

    Flutter 状态管理的实现

    这篇文章主要介绍了Flutter 状态管理的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06

最新评论