Kotlin ExpandableListView可扩展二级列表,2024年阿里Android高级面试题及答案

android:id=“@+id/elvContent”

android:layout_width=“match_parent”

android:layout_height=“match_parent”

android:groupIndicator=“@null” />

5.StatisticsActivity.kt

5.1

fun initView() {

adapter = DetailExpandableListAdapter(this)

elvContent.setAdapter(adapter)

}

5.2 可以自己设置数据,注意:必须要有规律,代码(注释说明)如下

fun initDatas() {

//"1"表示标题

var sc = SitCode(1, “1”, “一栋宿舍”);list.add(sc)

//"1A"表示第一组

sc = SitCode(2, “1A”, “宿舍2001”);list.add(sc)

//“1AA”,“1AB”,“1AC”,"1AD"表示子选项

sc = SitCode(3, “1AA”, “小红”);list.add(sc)

sc = SitCode(4, “1AB”, “小彬”);list.add(sc)

sc = SitCode(5, “1AC”, “小强”);list.add(sc)

sc = SitCode(6, “1AD”, “小红”);list.add(sc)

//"1B"表示第二组

sc = SitCode(7, “1B”, “宿舍2002”);list.add(sc)

//“1BA”,"1BB"表示子选项

sc = SitCode(8, “1BA”, “小可”);list.add(sc)

sc = SitCode(9, “1BB”, “小雪”);list.add(sc)

sc = SitCode(10, “1BC”, “小飞”);list.add(sc)

//"1C"表示第三组

sc = SitCode(11, “1C”, “宿舍2003”);list.add(sc)

//“1CA”,“1CB”,"1CC"表示子选项

sc = SitCode(12, “1CA”, “小和”);list.add(sc)

sc = SitCode(13, “1CB”, “小杨”);list.add(sc)

sc = SitCode(14, “1CC”, “小一”);list.add(sc)

//"1D"表示第四组

sc = SitCode(15, “1D”, “宿舍2004”);list.add(sc)

//"2"表示标题

sc = SitCode(16, “2”, “二栋宿舍”);list.add(sc)

//"2A"表示第五组

sc = SitCode(17, “2A”, “宿舍2005”);list.add(sc)

//"2B"表示第六组

sc = SitCode(18, “2B”, “宿舍2006”);list.add(sc)

//“2BA”,“2BB”,"1CC"表示子选项

sc = SitCode(19, “2BA”, “小山”);list.add(sc)

sc = SitCode(20, “2BB”, “小梅”);list.add(sc)

//"2C"表示第七组

sc = SitCode(21, “2C”, “宿舍2007”);list.add(sc)

//"3"表示标题

sc = SitCode(22, “3”, “三栋宿舍”);list.add(sc)

//"3A"表示第八组

sc = SitCode(23, “3A”, “宿舍2008”);list.add(sc)

//"3B"表示第九组

sc = SitCode(24, “3B”, “宿舍2009”);list.add(sc)

//"3C"表示第十组

sc = SitCode(25, “3C”, “宿舍2010”);list.add(sc)

//"4"表示标题

sc = SitCode(26, “4”, “四栋宿舍”);list.add(sc)

5.2.1 我做开发时就用sqlite数据库上设置数据比较好,需要和SQL Server一致,如下图

在这里插入图片描述

如何用代码获取sqlite数据库的数据,你需要的话,可以点击

Kotlin开发 如何获取SQLite数据库上自己创建规律的可扩展二级列表数据

5.3 代码(注释说明)如下

for (sitcode in list) {

val code = sitcode.code

//如果code是“1”或者“1A”或者“1AB”

when (code.length) {

//组数据给groups,groups包括有标题和组

//"1"的长度是1就给groups赋值

1 -> groups.add(sitcode)

//"1A"的长度是2就给groups赋值

2 -> groups.add(sitcode)

else -> {

//1AB(子选项)的长度是3就给对应的group赋值

val groupCode = code.substring(0, 2)

var childs = groupChilds[groupCode]

if (childs == null) {

childs = ArrayList()

groupChilds[groupCode] = childs

}

childs.add(sitcode)

}

}

}

5.4 获取指定组位置处的组数据

override fun getGroupView(groupPosition: Int, isExpanded: Boolean, convertView: View?, parent: ViewGroup?): View {

var convertView = convertView

var viewHolder: ViewHolder = ViewHolder.getViewHolder(inflater, convertView, parent, R.layout.item_ser_detail)

val sitCode = getGroup(groupPosition)

convertView = viewHolder.convertView

val iv: ImageView = viewHolder.getView(R.id.iv_ser) as ImageView

//如果sitCode.code=“1A”(组)

if (sitCode.code.length == 2){

//如果“1A”有子选项“1AA”

if (list[sitCode.id].code.length == 3 ){

//把箭头开了

iv.visibility = View.VISIBLE

}

}else{

//如果“1A”没有子选项,箭头就隐去

iv.visibility = View.GONE

}

iv.setImageResource(R.mipmap.ic_arrow_down)

if (!isExpanded) {

iv.setImageResource(R.mipmap.ic_arrow_right)

}

convertView.setBackgroundResource(

if (sitCode.code.length == 1)

R.drawable.alert_info_shap

else

R.color.white

)

val NameTv: TextView = viewHolder.getView(R.id.tv_ser_name)

val paddingDip = TypedValue.applyDimension(

TypedValue.COMPLEX_UNIT_DIP,

12f,

PhoneU.getScreenPix(context)

).toInt()

NameTv.setPadding(paddingDip, paddingDip, paddingDip, paddingDip)

NameTv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16f)

var text = “”

if (sitCode.code.length == 1) {

text = sitCode.name

} else if (sitCode.code.length == 2) {

text = sitCode.name

}

viewHolder.setText(R.id.tv_ser_name, text)

viewHolder.setTextColor(R.id.tv_ser_name, Color.RED)

return convertView

}

在这里插入图片描述

5.5 该方法决定每个子选项的外观

override fun getChildView(groupPosition: Int, childPosition: Int, isLastChild: Boolean,

convertView: View?, parent: ViewGroup?): View {

var convertView = convertView

val viewHolder: ViewHolder = ViewHolder.getViewHolder(inflater, convertView, parent, R.layout.item_ser_detail)

convertView = viewHolder.convertView

convertView.setBackgroundResource(R.color.white)

val NameTv: TextView = viewHolder.getView(R.id.tv_ser_name)

val Code = getChild(groupPosition, childPosition)

viewHolder.setText(R.id.tv_ser_name, Code?.name)

return convertView

}

在这里插入图片描述
5.6 源代码zip下载:
下载源代码

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

结语

  • 现在随着短视频,抖音,快手的流行NDK模块开发也显得越发重要,需要这块人才的企业也越来越多,随之学习这块的人也变多了,音视频的开发,往往是比较难的,而这个比较难的技术就是NDK里面的技术。
  • 音视频/高清大图片/人工智能/直播/抖音等等这年与用户最紧密,与我们生活最相关的技术一直都在寻找最终的技术落地平台,以前是windows系统,而现在则是移动系统了,移动系统中又是以Android占比绝大部分为前提,所以AndroidNDK技术已经是我们必备技能了。
  • 要学习好NDK,其中的关于C/C++,jni,Linux基础都是需要学习的,除此之外,音视频的编解码技术,流媒体协议,ffmpeg这些都是音视频开发必备技能,而且
  • OpenCV/OpenGl/这些又是图像处理必备知识,下面这些我都是当年自己搜集的资料和做的一些图,因为当年我就感觉视频这块会是一个大的趋势。所以提前做了一些准备。现在拿出来分享给大家。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

要学习好NDK,其中的关于C/C++,jni,Linux基础都是需要学习的,除此之外,音视频的编解码技术,流媒体协议,ffmpeg这些都是音视频开发必备技能,而且

  • OpenCV/OpenGl/这些又是图像处理必备知识,下面这些我都是当年自己搜集的资料和做的一些图,因为当年我就感觉视频这块会是一个大的趋势。所以提前做了一些准备。现在拿出来分享给大家。

[外链图片转存中…(img-F7skwrvA-1712591249662)]

[外链图片转存中…(img-2OH52b4o-1712591249662)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 26
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值