在Android中解析XML文件并在RecyclerView中显示

news2024/11/17 23:38:10

1. 引言

最近工作有解析外部xml文件在App中显示的需求,特来写篇文章记录一下,方便下次使用。

2. 准备工作

首先,在项目的AndroidManifest.xml文件中添加读取外部存储的权限声明。

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

3. XML示例文件

<?xml version="1.0" encoding="UTF-8"?>
<items>
    <item>
        <number>1</number>
        <description>First item description</description>
    </item>
    <item>
        <number>2</number>
        <description>Second item description</description>
    </item>
</items>

4. 请求运行时权限

在你的Activity中,需要处理运行时权限请求。

private val requestPermissionLauncher =
    registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted: Boolean ->
        if (isGranted) {
            readAndParseXmlFile()
        } else {
            Toast.makeText(this, "读取外部存储权限被拒绝", Toast.LENGTH_SHORT).show()
        }
    }

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    when {
        ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) ==
                PackageManager.PERMISSION_GRANTED -> {
            readAndParseXmlFile()
        }
        else -> {
            requestPermissionLauncher.launch(Manifest.permission.READ_EXTERNAL_STORAGE)
        }
    }
}

5. 定义数据模型和适配器

定义一个数据类Item和一个RecyclerView的适配器ItemAdapter。

Item.kt

data class Item(val number: Int, val description: String)

ItemAdapter.kt

class ItemAdapter(private val items: MutableList<Item>) :
    RecyclerView.Adapter<ItemAdapter.ItemViewHolder>() {

    class ItemViewHolder(val textView: TextView) : RecyclerView.ViewHolder(textView)

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder {
        val textView = LayoutInflater.from(parent.context)
            .inflate(android.R.layout.simple_list_item_2, parent, false) as TextView
        return ItemViewHolder(textView)
    }

    override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
        val (number, description) = items[position]
        holder.textView.text = "$number - $description"
    }

    override fun getItemCount() = items.size

    fun addItem(item: Item) {
        items.add(item)
        notifyItemInserted(items.size - 1)
    }
}

6. 解析XML文件

义一个方法来解析XML文件,并在解析出新数据时即时更新RecyclerView。

private fun parseXmlAndUpdateRecyclerView(inputStream: InputStream) {
    try {
        val factory = XmlPullParserFactory.newInstance()
        factory.isNamespaceAware = true
        val parser = factory.newPullParser()
        parser.setInput(inputStream, null)

        var eventType = parser.eventType
        var currentNumber: Int? = null
        var currentDescription: String? = null

        while (eventType != XmlPullParser.END_DOCUMENT) {
            when (eventType) {
                XmlPullParser.START_TAG -> {
                    when (parser.name) {
                        "number" -> currentNumber = parser.nextText().toIntOrNull()
                        "description" -> currentDescription = parser.nextText()
                    }
                }
                XmlPullParser.END_TAG -> {
                    if (parser.name == "item" && currentNumber != null && currentDescription != null) {
                        val newItem = Item(currentNumber, currentDescription)
                        runOnUiThread {
                            adapter.addItem(newItem)
                        }
                        currentNumber = null
                        currentDescription = null
                    }
                }
            }
            eventType = parser.next()
        }

    } catch (e: Exception) {
        Log.e("XMLParser", "Error parsing XML", e)
        Toast.makeText(this, "解析XML文件失败: ${e.message}", Toast.LENGTH_SHORT).show()
    } finally {
        try {
            inputStream.close()
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }
}

7. 使用

在你的代码中直接调用readAndParseXmlFile方法,我是把xml文件直接放到了 sdcard目录下了,你也可以随意修改目录,注意不同安卓版本的权限问题,

    private fun readAndParseXmlFile() {
        try {
            // 修改为从SD卡根目录获取XML文件
            val xmlFile = File(Environment.getExternalStorageDirectory(), "data.xml")

            if (!xmlFile.exists()) {
                Log.e("XMLParser", "File does not exist.")
                Toast.makeText(this, "XML文件不存在", Toast.LENGTH_SHORT).show()
                return
            }

            FileInputStream(xmlFile).use { fis ->
                parseXmlAndUpdateRecyclerView(fis)
            }

        } catch (e: Exception) {
            Log.e("XMLParser", "Error reading XML file", e)
            Toast.makeText(this, "读取XML文件失败: ${e.message}", Toast.LENGTH_SHORT).show()
        }
    }

8.效果图

在这里插入图片描述


THE END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1716566.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

社交媒体数据恢复:百度贴吧

一、准备工作 请先确保您已登录百度账号&#xff0c;并熟悉百度贴吧的基本操作。 二、找回被系统删除的帖子 进入“我的”页面&#xff1a;在百度贴吧主页中&#xff0c;点击右下角的“我的”。 进入“我的帖子”页面&#xff1a;在个人中心页面中&#xff0c;点击“我的帖子…

生态农业:引领未来农业新篇章

生态农业&#xff0c;正以其独特的魅力和创新理念&#xff0c;引领着未来农业发展的新篇章。在这个充满变革的时代&#xff0c;我们需要更加关注农业的可持续发展&#xff0c;而生态农业正是实现这一目标的重要途径。 生态农业产业的王总说&#xff1a;生态农业强调生态平衡和可…

图形学初识--空间变换

文章目录 前言正文矩阵和向量相乘二维变换1、缩放2、旋转3、平移4、齐次坐标下总结 三维变换1、缩放2、平移3、旋转绕X轴旋转&#xff1a;绕Z轴旋转&#xff1a;绕Y轴旋转&#xff1a; 结尾&#xff1a;喜欢的小伙伴可以点点关注赞哦 前言 前面章节补充了一下基本的线性代数中…

2、C++简单程序设计:工具、数据类型与运算符

C简单编程 C编程工具程序开发基本概念程序工具VS界面简介项目创建项目调试帮助文档 C数据类型C程序基本结构C符号关键字标识符文字运算符分隔符空白 C数据类型基本数据类型常量变量符号常量 C运算符与表达式算术运算符关系运算符逻辑运算符位运算符赋值运算符杂项运算符C 中的运…

光伏设计有哪些工具可以使用?

在光伏系统的设计过程中&#xff0c;选择合适的工具对于提高设计效率、确保系统性能以及优化成本效益至关重要。以下是一些常用的光伏设计工具&#xff0c;它们在不同的设计阶段发挥着重要作用。 一、专业设计软件 专业设计软件是光伏系统设计的核心工具。这些软件提供了从初…

2024 手机端使用现有网络资源在外网预览海康威视摄像头画面

一、适用场景 1、家有老人行动不便时&#xff0c;远离家乡的你&#xff0c;是否想了解一下老人的现状态&#xff08;如&#xff1a;老人是否摔倒爬不起来、是否遇到救助无人的环境&#xff09;。 2、天气炎热或寒冷的情况下&#xff0c;离出租房较远&#xff0c;身为出租房老板…

BU01板卡引脚

概述 BU01 是一款高速采集卡&#xff0c;主要用于高带宽数据采集及传输&#xff0c;应用领域多为数据中 心及数据采集领域。 端口提供60Gbps 传输带宽&#xff0c;可兼容2 个SFP万兆网口&#xff0c;和1 个40GE QSFP 光 口。和主机通信采用的是PCIE 2.0 x8 模式&#xff0c;最…

2024-5-29 石群电路-17

2024-5-29&#xff0c;星期三&#xff0c;17:26&#xff0c;天气&#xff1a;晴&#xff0c;心情&#xff1a;晴.今天又是阳光明媚的一天&#xff0c;没有什么特别的事情发生&#xff0c;给女朋友做了好吃的&#xff0c;吃了西瓜&#xff0c;加油学习&#xff0c;嘻嘻嘻~~~~ 今…

【CALayer-时钟练习-旋转 Objective-C语言】

一、好,接下来呢,我们要让它旋转出来, 1.让它先旋转起来啊,这根秒针,让它先转着, 把之前的代码复制粘贴一份,改个名字,叫:07-时钟练习(旋转) 旋转的话,我现在应该让它,一秒钟,旋转一次,一秒钟,旋转一次, 那么,这个时候,我们应该怎么样去做, 我现在这个是…

打造云计算时代的仿真软件

2024年5月25日&#xff0c;北京云道智造科技有限公司&#xff08;下称“云道智造”&#xff09;在深圳成功举办了2024新品发布会暨用户大会。来自全国各地的近500位客户和合作伙伴代表齐聚一堂&#xff0c;共同见证了云道智造新产品的隆重发布&#xff0c;交流分享了仿真领域的…

深入理解哈希加密:md5在保护用户数据中的应用

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、md5加密方法简介 二、md5加密方法的实现 示例代码&#xff1a; 三、md5加密方法在实际…

母亲的爱与妻子的爱,同为“爱“。不同感受!

母亲的爱与妻子的爱&#xff0c;虽然都是一个女人给予男人的爱&#xff0c;却有着本质的不同&#xff01; 天下父母对儿女的爱大多相同。在母亲眼中&#xff0c;儿女无论是多大年龄&#xff0c;无论你是否长大成人&#xff0c;也无论你做多大的官&#xff0c;有多么大的成就&am…

【ai】livekit服务本地开发模式2:模拟1个发布者

是一个会议用软件:LiveKit is an open source project that provides scalable, multi-user conferencing based on WebRTC. It’s designed to provide everything you need to build real-time video audio data capabilities in your applications.LiveKit’s server is wr…

现场辩论赛活动策划方案

活动目的&#xff1a; 技能竞赛中的辩论环节既可以考核员工的知识点&#xff0c;同时也可以考核员工业务办事能力&#xff0c;表达能力&#xff0c;是一种比较全面且较有深度的竞赛方式。 辩论赛细则&#xff1a; 1、时间提示 : 自由辩论阶段&#xff0c;每方使用时间剩…

【2024.5.29数据库MYSQL史上最详细基础学习汇总】

初识数据库 什么是数据库: DB的全称是database,即数据库的意思。数据库实际上就是一个文件集合,是一个存储数据的仓库,数据库是按照特定的格式把数据存储起来,用户可以对存储的数据进行增删改查操作; 什么是关系型数据库(SQL)? 关系型数据库是依据关系模型来创建的…

低代码开发难吗?

在软件开发的多样化浪潮中&#xff0c;低代码开发平台以其简化的编程模型&#xff0c;为IT行业带来了新的活力。作为一位资深的IT技术员&#xff0c;我对低代码开发平台的易用性和强大功能有着深刻的认识。今天&#xff0c;我将分享我对YDUIbuilder这一免费开源低代码平台的使用…

超结MOS在全桥电路上的应用-REASUNOS瑞森半导体

一、前言 全桥电路定义 全桥电路是一种常见的电子电路&#xff0c;由四个开关管和一个负载组成&#xff0c;可将直流电转换为交流电。 全桥电路的应用领域 全桥电路广泛应用于电力电子领域&#xff0c;如开关电源、变频器、逆变器、电动汽车、工业自动化等领域 。在电路中&…

JetLinks物联网平台在windows 7搭建(前后端)部署教程

近期对接TCP、modbusTCP等自定义解析&#xff0c;做了很多万能解析的方法&#xff0c;却都不遂人意&#xff0c;而一直在用的ThingsBoard不能直接对接TCP透传(企业版除外)&#xff0c;需要在外围做一些自定义解析&#xff0c;然后转json再mqtt上传&#xff0c;感觉来说比较麻烦…

湘潭大学软件工程专业oracle-sqlplus安装教程

前言 笔者在网上找了一些教程&#xff0c;但是没有装好&#xff0c;或者不知道啥原因&#xff0c;反正就是登不进去老师要求的系统&#xff0c;连接不上服务器&#xff0c;非常苦恼&#xff0c;请教了一下同学&#xff0c;终于弄好了&#xff0c;本文希望能帮助到和我一样有相…

微信公众号开发(一):准备工作

微信公众号除了可以用来发文章&#xff0c;但也可以用来做一些自动回复的小工具&#xff0c;比如&#xff1a; 下面&#xff0c;记录一下开发过程&#xff0c;先是一些准备工作&#xff1a; 一&#xff1a;公众号设置 1、申请公众号 2、进入公众号后台&#xff0c;记录AppID…