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移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合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)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!