最后
总之啊,家里没矿的同学们,如果你们想以后的日子过得好一些,多想想你们的业余时间怎么安排吧;
技术方面的提升肯定是重中之重,但是技术外的一些“软实力”也不能完全忽视,很多时候升职确实是因为你的技术足够强,但也与你的“软实力”密切相关
在这我也分享一份大佬自己收录整理的 Android学习PDF+架构视频+面试文档+源码笔记 ,还有高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料这些都是我闲暇还会反复翻阅并给下属员工学习的精品资料。在脑图中,每个知识点专题都配有相对应的实战项目,可以有效的帮助大家掌握知识点。
总之也是在这里帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习
相信自己,没有做不到的,只有想不到的
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
#61d2d6
#f1592a
使用方法
使用方法如下所示:
导入到项目
先在主项目的build.gradle文件添加如下代码:
allprojects {
repositories {
…
maven { url ‘https://jitpack.io’ }
}
}
然后在你想要使用的模块中添加依赖,对应的build.gradle文件代码如下所示:
dependencies {
implementation ‘com.github.TanJiaJunBeyond:JSONRecyclerView:1.0.0’
}
添加到视图
然后将JsonRecyclerView添加到xml文件中,代码如下所示:
<com.tanjiajun.jsonrecyclerview.view.JSONRecyclerView
android:id=“@+id/rv_json”
android:layout_width=“match_parent”
android:layout_height=“match_parent” />
或者通过addView相关的方法添加到视图中,代码如下所示:
val rvJson = JSONRecyclerView(this)
linearLayout.addView(rvJson)
我们可以通过setStyle方法改变样式,代码如下所示:
rvJson.setStyles(textColor = ContextCompat.getColor(this,R.color.black))
绑定数据
通过bindData方法绑定数据,接受JSON字符串、JSONObject和JSONArray三种类型的数据。
当我们数据类型是JSON字符串的时候,可以调用以下方法:
// JSONRecyclerView.kt
/**
- 绑定JSON字符串数据。
- Bind the json string data.
- @param jsonString The json string to bind.(要绑定的JSON字符串。)
*/
fun bindData(jsonString: String) =
adapter.bindData(jsonString)
当我们数据类型是JSONObject的时候,可以调用以下方法:
// JSONRecyclerView.kt
/**
- 绑定JSONObject数据。
- Bind the json object data.
- @param jsonObject The json object to bind.(要绑定的JSONObject。)
*/
fun bindData(jsonObject: JSONObject) =
adapter.bindData(jsonObject)
当我们数据类型是JSONArray的时候,可以调用以下方法:
// JSONRecyclerView.kt
/**
- 绑定JSONArray数据。
- Bind the json array data.
- @param jsonArray The json array to bind.(要绑定的JSONArray。)
*/
fun bindData(jsonArray: JSONArray) =
adapter.bindData(jsonArray)
示例代码
代码如下所示:
package com.tanjiajun.jsonrecyclerviewdemo
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.tanjiajun.jsonrecyclerview.view.JSONRecyclerView
/**
- Created by TanJiaJun on 6/1/21.
*/
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
findViewById(R.id.rv_json).bindData(
“{\n” +
" “string”:“string”,\n" +
" “number”:100,\n" +
" “boolean”:true,\n" +
" “url”:“https://github.com/TanJiaJunBeyond/JSONRecyclerView”,\n" +
" “JSONObject”:{\n" +
" “string”:“string”,\n" +
" “number”:100,\n" +
" “boolean”:true\n" +
" },\n" +
" “JSONArray”:[\n" +
" {\n" +
" “string”:“string”,\n" +
" “number”:100,\n" +
" “boolean”:true\n" +
" }\n" +
" ]\n" +
“}”
)
}
}
核心代码
大部分代码都有中英文对应的注释,可能有些地方翻译地不太好,请各位见谅哈。
上面也提到了,该控件是以RecyclerView为基础,涉及到JsonItemView、JsonViewAdapter和JsonRecyclerView三个类。
JSONItemView
该类用于展示每一条数据对应的视图,用到的布局文件是item_json_view.xml,它继承LinearLayout,有四个关键的变量,代码如下所示:
// JSONItemView.kt
private lateinit var tvLeft: TextView
private lateinit var ivIcon: ImageView
private lateinit var tvRight: TextView
/**
-
Set the scaled pixel text size.
-
设置文本大小。
*/
var textSize = DEFAULT_TEXT_SIZE_SP
set(value) {
// 范围是[12.0F,30.0F]
field = when {
value < 12.0F -> 12.0F
value > 30.0F -> 30.0F
else -> value
}
// 设置左边文本的文字大小
tvLeft.textSize = field
// 设置展示展开和收缩图标的大小
val size = TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP,
field,
resources.displayMetrics
).toInt()
ivIcon.layoutParams = (ivIcon.layoutParams as LinearLayout.LayoutParams).apply {
width = size
height = size
}
// 设置右边文本的文字大小
tvRight.textSize = field
} -
变量tvLeft是左边的TextView,用于展示key相关的文本。
-
变量ivIcon是中间的ImageView,用于展示展开或者收缩的图标
-
变量tvRight是右边的TextView,用于展示value相关的文本。
-
变量textSize是public的变量,可以通过该变量改变文本的大小,要注意的是,单位是sp,无论是赋多大或者多小值,文本的最小值是12sp,最大值是30sp。
JSONViewAdapter
该类用于处理不同类型的数据和点击相关的逻辑,它继承RecyclerView.Adapter,主要涉及到如下几个关键的方法:
onBindViewHolder方法
代码如下所示:
// JSONViewAdapter.kt
override fun onBindViewHolder(holder: JSONViewAdapter.JsonItemViewHolder, position: Int) {
with(holder.jsonItemView) {
textSize = this@JSONViewAdapter.textSize
setRightColor(textColor)
jsonObject?.let { bindJSONObjectData(position, it) }
jsonArray?.let { bindJSONArrayData(position, it) }
}
}
作用是将数据绑定到视图,如果数据类型是JSONObject,就调用bindJSONObjectData方法,如果数据类型是JSONArray,就调用bindJSONArrayData方法。
handleValue方法
代码如下所示:
// JSONViewAdapter.kt
/**
- Handle the styling of the right part of the json item view (i.e., the part that shows the value).
- 处理JsonItemView右边部分的样式(即展示值的部分)。
- @param value The value to be displayed in the json item view.(要在JsonItemView展示的value。)
- @param itemView The json item view to be processed.(要处理的JsonItemView对象。)
- @param appendComma Whether to append commas.(是否附加逗号。)
- @param hierarchy The number of view hierarchies.(View的层次结构数量。)
*/
private fun handleValue(
value: Any?,
itemView: JSONItemView,
appendComma: Boolean,
hierarchy: Int
) {
itemView.showRight(SpannableStringBuilder().apply {
when (value) {
is Number ->
// 处理值为Number类型的样式
handleNumberValue(itemView, value)
is Boolean ->
// 处理值为Boolean类型的样式
handleBooleanValue(itemView, value)
is String ->
// 处理值为String类型的样式
handleStringValue(itemView, value)
is JSONObject ->
// 处理值为JSONObject类型的样式
handleJSONObjectValue(itemView, value, appendComma, hierarchy)
is JSONArray ->
// 处理值为JSONArray类型的样式
handleJSONArrayValue(itemView, value, appendComma, hierarchy)
else ->
// 处理值为null的样式
handleNullValue(itemView)
}
if (appendComma) append(“,”)
})
}
onClick方法
如果数据类型是JSONObject或者JSONArray的话,可以通过点击来展开或者收缩视图,代码如下所示:
如果是第一次展开,就调用performFirstExpand方法,否则就调用performClick方法,代码如下所示:
// JSONViewAdapter.kt
override fun onClick(v: View?) {
// 如果itemView的子View数量是1,就证明这是第一次展开
(itemView.childCount == 1)
.yes { performFirstExpand() }
.otherwise { performClick() }
}
performFirstExpand方法
该方法用于第一次展开JSONObject或者JSONArray对应的itemView,代码如下所示:
// JSONViewAdapter.kt
/**
- The first time the view corresponding to a JSONObject or JSONArray is expanded.
- 第一次展开JSONObject或者JSONArray对应的itemView。
*/
private fun performFirstExpand() {
isExpanded = true
itemView.showIcon(false)
itemView.tag = itemView.getRightText()
itemView.showRight(if (isJsonObject) “{” else “[”)
// 展开该层级以下的视图
val array: JSONArray? =
if (isJsonObject) (value as JSONObject).names() else value as JSONArray
val length = array?.length() ?: 0
for (i in 0 until length) {
itemView.addViewNoInvalidate(JSONItemView(itemView.context).apply {
textSize = this@JSONViewAdapter.textSize
setRightColor(textColor)
val childValue = array?.opt(i)
isJsonObject
.yes {
handleJSONObject(
key = childValue as String,
value = (value as JSONObject)[childValue],
appendComma = i < length - 1,
hierarchy = hierarchy
)
}
.otherwise {
handleJSONArray(
value = childValue,
appendComma = i < length - 1,
hierarchy = hierarchy
)
}
})
}
// 展示该层级最后的一个视图
itemView.addViewNoInvalidate(JSONItemView(itemView.context).apply {
textSize = this@JSONViewAdapter.textSize
setRightColor(textColor)
showRight(
StringBuilder(getHierarchyStr(hierarchy - 1))
.append(if (isJsonObject) “}” else “]”)
.append(if (appendComma) “,” else “”)
)
})
// 重绘itemView
itemView.requestLayout()
itemView.invalidate()
}
performClick方法
该方法用于点击后展开或者收缩,代码如下所示:
/**
- Click to expand or collapse.
- 点击后展开或者收缩。
*/
private fun performClick() {
itemView.showIcon(isExpanded)
val rightText = itemView.getRightText()
itemView.showRight(itemView.tag as CharSequence)
itemView.tag = rightText
for (i in 1 until itemView.childCount) {
// 如果展开的话,就把子View都设成可见状态,否则就设为隐藏状态
itemView.getChildAt(i).visibility = if (isExpanded) View.GONE else View.VISIBLE
}
isExpanded = !isExpanded
}
如果数据类型是url的话,可以通过点击来打开浏览器查看,代码如下所示:
/**
- Click to expand or collapse.
- 点击后展开或者收缩。
*/
private fun performClick() {
itemView.showIcon(isExpanded)
val rightText = itemView.getRightText()
itemView.showRight(itemView.tag as CharSequence)
推荐学习资料
- 脑图
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
harSequence)
推荐学习资料
- 脑图
[外链图片转存中…(img-rtjJodYV-1715891825941)]
[外链图片转存中…(img-slx7eeFM-1715891825941)]
[外链图片转存中…(img-oui5ditL-1715891825941)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!