refactor(app): 重构代码表页面布局和功能
- 更新 activity_code_table.xml 布局,简化结构并添加工具栏 - 重写 CodeTableAdapter,改为使用 BaseExpandableListAdapter -移除 CodeTableItemAdapter,直接在 CodeTableAdapter 中处理条目布局 - 更新代码表项布局,使用新的 code_table_group.xml 文件 - 优化搜索和过滤功能,使用 InputDialog 替代原有的搜索框 - 改进代码示例展示方式,使用 MaterialAlertDialog 替代底部对话框 - 优化类型信息展示,根据开发者模式显示不同内容
This commit is contained in:
parent
5f137e0469
commit
5d4b9c7d29
|
@ -1,25 +1,18 @@
|
|||
package com.coldmint.rust.pro
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.graphics.Color
|
||||
import android.os.Bundle
|
||||
import android.text.Editable
|
||||
import android.text.Spannable
|
||||
import android.text.SpannableString
|
||||
import android.text.TextWatcher
|
||||
import android.text.method.LinkMovementMethod
|
||||
import android.text.style.ClickableSpan
|
||||
import android.view.LayoutInflater
|
||||
import android.view.Menu
|
||||
import android.view.View
|
||||
import android.view.inputmethod.EditorInfo
|
||||
import android.view.*
|
||||
import androidx.core.view.isVisible
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import com.coldmint.dialog.InputDialog
|
||||
import com.coldmint.rust.core.database.code.CodeDataBase
|
||||
import com.coldmint.rust.core.database.code.CodeInfo
|
||||
import com.coldmint.rust.core.database.code.SectionInfo
|
||||
import com.coldmint.rust.pro.adapters.CodeTableAdapter
|
||||
import com.coldmint.rust.pro.adapters.CodeTableItemAdapter
|
||||
import com.coldmint.rust.pro.base.BaseActivity
|
||||
import com.coldmint.rust.pro.databinding.ActivityCodeTableBinding
|
||||
import java.util.concurrent.Executors
|
||||
|
@ -30,76 +23,11 @@ class CodeTableActivity : BaseActivity<ActivityCodeTableBinding>() {
|
|||
override fun whenCreateActivity(savedInstanceState: Bundle?, canUseView: Boolean) {
|
||||
if (canUseView) {
|
||||
title = getString(R.string.code_table)
|
||||
viewBinding.edittext.hint = title
|
||||
|
||||
setReturnButton()
|
||||
loadData()
|
||||
//设置上下选择按钮
|
||||
viewBinding.listTop.setOnClickListener {
|
||||
if (CodeTableAdapter.picklist.isEmpty()) {
|
||||
return@setOnClickListener
|
||||
}
|
||||
|
||||
if (--CodeTableAdapter.pick < 0) {
|
||||
CodeTableAdapter.pick = 0
|
||||
}
|
||||
val get = CodeTableAdapter.picklist[CodeTableAdapter.pick]
|
||||
(viewBinding.codeRecyclerB.layoutManager as LinearLayoutManager).scrollToPositionWithOffset(get, 0)
|
||||
}
|
||||
viewBinding.listButtom.setOnClickListener {
|
||||
if (CodeTableAdapter.picklist.isEmpty()) {
|
||||
return@setOnClickListener
|
||||
}
|
||||
val size = CodeTableAdapter.picklist.size
|
||||
|
||||
if (++CodeTableAdapter.pick == size - 1) {
|
||||
CodeTableAdapter.pick = 0
|
||||
}
|
||||
val get = CodeTableAdapter.picklist[CodeTableAdapter.pick]
|
||||
(viewBinding.codeRecyclerB.layoutManager as LinearLayoutManager).scrollToPositionWithOffset(get,
|
||||
0)
|
||||
}
|
||||
viewBinding.edittext.addTextChangedListener(object : TextWatcher {
|
||||
override fun beforeTextChanged(a: CharSequence?, p1: Int, p2: Int, p3: Int) {
|
||||
}
|
||||
|
||||
override fun onTextChanged(a: CharSequence?, p1: Int, p2: Int, p3: Int) {
|
||||
/* if (a.isNullOrEmpty()) {
|
||||
loadData()
|
||||
return
|
||||
}
|
||||
loadData(a.toString())*/
|
||||
if (a.isNullOrEmpty()) {
|
||||
viewBinding.searchPick.isVisible = false
|
||||
loadData()
|
||||
}
|
||||
}
|
||||
|
||||
override fun afterTextChanged(a: Editable?) {
|
||||
}
|
||||
})
|
||||
viewBinding.edittext.setOnEditorActionListener { v, p1, _ ->
|
||||
if (p1 == EditorInfo.IME_ACTION_SEARCH) {
|
||||
if (v?.text.isNullOrEmpty()) {
|
||||
loadData()
|
||||
} else {
|
||||
var toString = v?.text.toString()
|
||||
if (toString.startsWith("/")) {
|
||||
toString = toString.substring(1)
|
||||
loadData(toString)
|
||||
} else {
|
||||
viewBinding.searchPick.isVisible = true
|
||||
adapter.item?.search(toString)
|
||||
}
|
||||
}
|
||||
}
|
||||
false
|
||||
}
|
||||
viewBinding.back.setOnClickListener { moveTaskToBack(true) }
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {
|
||||
if (keyCode == KeyEvent.KEYCODE_BACK && event.action == KeyEvent.ACTION_DOWN) {
|
||||
|
@ -108,16 +36,22 @@ class CodeTableActivity : BaseActivity<ActivityCodeTableBinding>() {
|
|||
}
|
||||
return super.onKeyDown(keyCode, event)
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
fun ifNeedFinish() {
|
||||
if (filterMode) {
|
||||
loadData()
|
||||
} else {
|
||||
finish()
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 加载数据
|
||||
* @param key String? 键
|
||||
* @param section String? 节
|
||||
*/
|
||||
fun loadData(key: String? = null, section: String? = null) {
|
||||
//如果 key start 有 / 则取后的string
|
||||
executorService.submit {
|
||||
filterMode = key != null || section != null
|
||||
val sectionMap = HashMap<String, String>()
|
||||
|
@ -158,7 +92,7 @@ class CodeTableActivity : BaseActivity<ActivityCodeTableBinding>() {
|
|||
codeDataBase.getCodeDao()
|
||||
.findCodeByCodeOrTranslateFromSection(key, section.code)
|
||||
}
|
||||
if (list.isNullOrEmpty()) {
|
||||
if (list == null || list.isEmpty()) {
|
||||
group.remove(section)
|
||||
} else {
|
||||
item.add(list)
|
||||
|
@ -166,33 +100,18 @@ class CodeTableActivity : BaseActivity<ActivityCodeTableBinding>() {
|
|||
}
|
||||
|
||||
if (group.isNotEmpty()) {
|
||||
adapter = CodeTableAdapter(this, group, item, viewBinding)
|
||||
val adapter = CodeTableAdapter(this, group, item)
|
||||
adapter.setVersionMap(versionMap)
|
||||
adapter.setTypeNameMap(typeNameMap)
|
||||
adapter.setSectionMap(sectionMap)
|
||||
if (adapter.item == null) {
|
||||
|
||||
adapter.item = CodeTableItemAdapter(viewBinding.codeRecyclerB, item[0])
|
||||
adapter.item!!.versionMap = versionMap
|
||||
adapter.item!!.typeNameMap = typeNameMap
|
||||
adapter.item!!.sectionMap = sectionMap
|
||||
CodeTableAdapter.i = group[0].translate
|
||||
}
|
||||
runOnUiThread {
|
||||
viewBinding.codeRecyclerB.adapter = adapter.item
|
||||
/* adapter.labelFunction = { _, _, string ->
|
||||
// section = string
|
||||
if (string.isEmpty()) {
|
||||
loadData()
|
||||
adapter.labelFunction = { index, view, string ->
|
||||
loadData(section = string)
|
||||
}
|
||||
loadData(string)
|
||||
}*/
|
||||
viewBinding.displayView.isVisible = false
|
||||
viewBinding.progressBar.isVisible = false
|
||||
viewBinding.expandableListView.isVisible = true
|
||||
viewBinding.expandableListView.layoutManager = LinearLayoutManager(this)
|
||||
viewBinding.expandableListView.adapter = adapter
|
||||
// viewBinding.expandableListView.swapAdapter(adapter, true)
|
||||
viewBinding.expandableListView.setAdapter(adapter)
|
||||
}
|
||||
} else {
|
||||
notFindKey(key)
|
||||
|
@ -200,15 +119,12 @@ class CodeTableActivity : BaseActivity<ActivityCodeTableBinding>() {
|
|||
}
|
||||
}
|
||||
|
||||
lateinit var adapter: CodeTableAdapter
|
||||
|
||||
/**
|
||||
* 没有找到节
|
||||
* @param key String?
|
||||
*/
|
||||
@SuppressLint("StringFormatInvalid")
|
||||
private fun notFindKey(key: String?) {
|
||||
if (!key.isNullOrBlank()) {
|
||||
fun notFindKey(key: String?) {
|
||||
if (key != null && key.isNotBlank()) {
|
||||
val tip = String.format(getString(R.string.not_find_code_name), key)
|
||||
val action = getString(R.string.not_find_units_action)
|
||||
val start = tip.indexOf(action)
|
||||
|
@ -222,8 +138,8 @@ class CodeTableActivity : BaseActivity<ActivityCodeTableBinding>() {
|
|||
}, start, start + action.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
|
||||
)
|
||||
}
|
||||
viewBinding.displayView.movementMethod = LinkMovementMethod.getInstance()
|
||||
viewBinding.displayView.highlightColor = Color.parseColor("#36969696")
|
||||
viewBinding.displayView.movementMethod = LinkMovementMethod.getInstance();
|
||||
viewBinding.displayView.highlightColor = Color.parseColor("#36969696");
|
||||
viewBinding.displayView.text = spannableString
|
||||
|
||||
}
|
||||
|
@ -232,16 +148,36 @@ class CodeTableActivity : BaseActivity<ActivityCodeTableBinding>() {
|
|||
viewBinding.progressBar.isVisible = false
|
||||
}
|
||||
|
||||
|
||||
override fun onCreateOptionsMenu(menu: Menu): Boolean {
|
||||
menuInflater.inflate(R.menu.menu_code_table, menu)
|
||||
val inflater = menuInflater
|
||||
inflater.inflate(R.menu.menu_code_table, menu)
|
||||
return true
|
||||
}
|
||||
|
||||
@Deprecated("Deprecated in Java", ReplaceWith("moveTaskToBack(true)"))
|
||||
override fun onBackPressed() {
|
||||
//显示桌面
|
||||
moveTaskToBack(true)
|
||||
// ifNeedFinish()
|
||||
|
||||
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
||||
when (item.itemId) {
|
||||
R.id.filter_units -> {
|
||||
InputDialog(this).setTitle(R.string.filter).setMessage(R.string.filter_tip)
|
||||
.setInputCanBeEmpty(false).setMaxNumber(20)
|
||||
.setPositiveButton(R.string.dialog_ok) { text ->
|
||||
var key = text
|
||||
if (key.length > 20) {
|
||||
key = key.substring(0, 20)
|
||||
}
|
||||
loadData(key)
|
||||
true
|
||||
}.setNegativeButton(R.string.dialog_close) {
|
||||
|
||||
}.show()
|
||||
}
|
||||
android.R.id.home -> {
|
||||
ifNeedFinish()
|
||||
return true
|
||||
}
|
||||
}
|
||||
return super.onOptionsItemSelected(item)
|
||||
}
|
||||
|
||||
override fun getViewBindingObject(layoutInflater: LayoutInflater): ActivityCodeTableBinding {
|
||||
|
|
|
@ -1,30 +1,55 @@
|
|||
package com.coldmint.rust.pro.adapters
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.Context
|
||||
import android.os.Handler
|
||||
import android.os.Looper
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import android.widget.BaseExpandableListAdapter
|
||||
import androidx.core.view.isVisible
|
||||
import com.afollestad.materialdialogs.MaterialDialog
|
||||
import com.coldmint.rust.core.database.code.CodeDataBase
|
||||
import com.coldmint.rust.core.database.code.CodeInfo
|
||||
import com.coldmint.rust.core.database.code.SectionInfo
|
||||
import com.coldmint.rust.core.tool.LineParser
|
||||
import com.coldmint.rust.pro.R
|
||||
import com.coldmint.rust.pro.base.BaseVh
|
||||
import com.coldmint.rust.pro.databinding.ActivityCodeTableBinding
|
||||
import com.coldmint.rust.pro.databinding.ItemCodetableBinding
|
||||
import com.coldmint.rust.pro.databinding.CodeTableGroupBinding
|
||||
import com.coldmint.rust.pro.databinding.CodeTableItemBinding
|
||||
import com.coldmint.rust.pro.tool.AppSettings
|
||||
import com.coldmint.rust.pro.tool.GlobalMethod
|
||||
import com.google.android.material.chip.Chip
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import java.util.concurrent.Executors
|
||||
|
||||
class CodeTableAdapter(
|
||||
val context: Context,
|
||||
private val group: List<SectionInfo>,
|
||||
private val itemList: List<List<CodeInfo>>,
|
||||
private val binding: ActivityCodeTableBinding
|
||||
) : RecyclerView.Adapter<BaseVh<ItemCodetableBinding>>() {
|
||||
private val itemList: List<List<CodeInfo>>
|
||||
) : BaseExpandableListAdapter() {
|
||||
|
||||
private val layoutInflater = LayoutInflater.from(context)
|
||||
|
||||
private var versionMap: HashMap<Int, String>? = null
|
||||
private var typeNameMap: HashMap<String, String>? = null
|
||||
private var sectionMap: HashMap<String, String>? = null
|
||||
private val executorService by lazy {
|
||||
Executors.newSingleThreadExecutor()
|
||||
}
|
||||
private val lineParser = LineParser()
|
||||
|
||||
//Label点击事件
|
||||
var labelFunction: ((Int, View, String) -> Unit)? = null
|
||||
private val developerMode by lazy {
|
||||
AppSettings
|
||||
.getValue(AppSettings.Setting.DeveloperMode, false)
|
||||
}
|
||||
|
||||
init {
|
||||
lineParser.symbol = ","
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 节名映射
|
||||
* @param sectionMap HashMap<String, String>
|
||||
|
@ -33,6 +58,7 @@ class CodeTableAdapter(
|
|||
this.sectionMap = sectionMap
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 设置类型名称映射
|
||||
* @param typeNameMap HashMap<String, String>?
|
||||
|
@ -49,73 +75,174 @@ class CodeTableAdapter(
|
|||
this.versionMap = versionMap
|
||||
}
|
||||
|
||||
override fun onCreateViewHolder(
|
||||
parent: ViewGroup,
|
||||
viewType: Int
|
||||
): BaseVh<ItemCodetableBinding> {
|
||||
return BaseVh(
|
||||
ItemCodetableBinding.inflate(
|
||||
LayoutInflater.from(parent.context),
|
||||
parent,
|
||||
false
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
override fun getItemCount(): Int {
|
||||
override fun getGroupCount(): Int {
|
||||
return group.size
|
||||
}
|
||||
|
||||
companion object {
|
||||
var i: String = null.toString()
|
||||
var pick: Int = 0
|
||||
var pickString: String = ""
|
||||
var picklist: MutableList<Int> = mutableListOf()
|
||||
override fun getChildrenCount(groupPosition: Int): Int {
|
||||
return itemList[groupPosition].size
|
||||
}
|
||||
|
||||
var item: CodeTableItemAdapter? = null
|
||||
|
||||
init {
|
||||
lineParser.symbol = ","
|
||||
override fun getGroup(groupPosition: Int): Any {
|
||||
return group[groupPosition]
|
||||
}
|
||||
|
||||
@SuppressLint("NotifyDataSetChanged", "StringFormatInvalid")
|
||||
override fun onBindViewHolder(holder: BaseVh<ItemCodetableBinding>, position: Int) {
|
||||
holder.binging.title.text = group[position].translate
|
||||
val format = String.format(
|
||||
override fun getChild(groupPosition: Int, childPosition: Int): Any {
|
||||
return itemList[groupPosition][childPosition]
|
||||
}
|
||||
|
||||
override fun getGroupId(groupPosition: Int): Long {
|
||||
return groupPosition.toLong()
|
||||
}
|
||||
|
||||
override fun getChildId(groupPosition: Int, childPosition: Int): Long {
|
||||
return childPosition.toLong()
|
||||
}
|
||||
|
||||
override fun hasStableIds(): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
override fun getGroupView(
|
||||
groupPosition: Int,
|
||||
isExpanded: Boolean,
|
||||
convertView: View?,
|
||||
parent: ViewGroup
|
||||
): View {
|
||||
val resultView: CodeTableGroupBinding =
|
||||
CodeTableGroupBinding.inflate(layoutInflater, parent, false)
|
||||
val info =
|
||||
String.format(
|
||||
context.getString(R.string.filenum),
|
||||
itemList[position].size
|
||||
)
|
||||
holder.binging.message.text = format
|
||||
holder.itemView.setOnClickListener {
|
||||
val finalPosition = holder.layoutPosition
|
||||
i = group[finalPosition].translate
|
||||
pick = 0
|
||||
pickString = ""
|
||||
picklist.clear()
|
||||
if (item != null) {
|
||||
item!!.list = itemList[position]
|
||||
binding.codeRecyclerB.adapter = item
|
||||
}
|
||||
notifyItemChanged(finalPosition)
|
||||
}
|
||||
if (group[position].translate == i) {
|
||||
//背景高亮
|
||||
holder.binging.root.setCardBackgroundColor(
|
||||
GlobalMethod.getThemeColor(
|
||||
context,
|
||||
com.google.android.material.R.attr.colorPrimaryContainer
|
||||
)
|
||||
)
|
||||
} else {
|
||||
//背景恢复
|
||||
holder.binging.root.setCardBackgroundColor(
|
||||
GlobalMethod.getThemeColor(
|
||||
context,
|
||||
com.google.android.material.R.attr.colorSurface
|
||||
)
|
||||
itemList[groupPosition].size
|
||||
)
|
||||
resultView.nameView.text = group[groupPosition].translate
|
||||
resultView.numView.text = info
|
||||
return resultView.root
|
||||
}
|
||||
|
||||
override fun getChildView(
|
||||
groupPosition: Int,
|
||||
childPosition: Int,
|
||||
isLastChild: Boolean,
|
||||
convertView: View?,
|
||||
parent: ViewGroup
|
||||
): View {
|
||||
val resultView: CodeTableItemBinding =
|
||||
CodeTableItemBinding.inflate(layoutInflater, parent, false)
|
||||
val codeInfo = itemList[groupPosition][childPosition]
|
||||
|
||||
// resultView.belongStackLabelView.onLabelClickListener = OnLabelClickListener { index, v, s ->
|
||||
// }
|
||||
resultView.descriptionView.text = codeInfo.description
|
||||
resultView.descriptionView.setOnClickListener {
|
||||
GlobalMethod.copyText(context, codeInfo.description, it)
|
||||
}
|
||||
resultView.titleView.text = codeInfo.translate
|
||||
resultView.titleView.setOnClickListener {
|
||||
GlobalMethod.copyText(context, codeInfo.translate, it)
|
||||
}
|
||||
|
||||
val demo = codeInfo.demo
|
||||
resultView.imageView.isVisible = demo.isNotBlank()
|
||||
resultView.imageView.setOnClickListener {
|
||||
val dialog = MaterialAlertDialogBuilder(context);
|
||||
dialog.setTitle(R.string.code_demo)
|
||||
dialog.setMessage(demo)
|
||||
dialog.setPositiveButton(R.string.dialog_ok){
|
||||
v,a->
|
||||
}
|
||||
dialog.show()
|
||||
}
|
||||
|
||||
resultView.subTitleView.text = codeInfo.code
|
||||
resultView.subTitleView.setOnClickListener {
|
||||
GlobalMethod.copyText(context, codeInfo.code, it)
|
||||
}
|
||||
resultView.valueTypeView.text = typeNameMap?.get(codeInfo.type) ?: codeInfo.type
|
||||
lineParser.text = codeInfo.section
|
||||
resultView.chipGroup.removeAllViews()
|
||||
var isNotEmpty = false
|
||||
lineParser.analyse { lineNum, lineData, isEnd ->
|
||||
isNotEmpty = true
|
||||
val text = sectionMap?.get(lineData) ?: lineData
|
||||
val chip = Chip(context)
|
||||
chip.text = text
|
||||
chip.setOnClickListener {
|
||||
labelFunction?.invoke(lineNum, it, text)
|
||||
}
|
||||
resultView.chipGroup.addView(chip)
|
||||
true
|
||||
}
|
||||
|
||||
resultView.chipGroup.isVisible = isNotEmpty
|
||||
resultView.valueTypeView.setOnClickListener {
|
||||
val handler = Handler(Looper.getMainLooper())
|
||||
executorService.submit {
|
||||
val codeDataBase = CodeDataBase.getInstance(context)
|
||||
val typeInfo = codeDataBase.getValueTypeDao().findTypeByType(codeInfo.type)
|
||||
if (typeInfo == null) {
|
||||
handler.post {
|
||||
handler.post {
|
||||
MaterialDialog(context).show {
|
||||
title(text = codeInfo.type).message(
|
||||
text = String.format(
|
||||
context.getString(
|
||||
R.string.unknown_type
|
||||
), codeInfo.type
|
||||
)
|
||||
)
|
||||
.positiveButton(R.string.dialog_ok)
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (developerMode) {
|
||||
val stringBuilder = StringBuilder()
|
||||
stringBuilder.append("介绍:")
|
||||
stringBuilder.append(typeInfo.describe)
|
||||
stringBuilder.append("\n附加信息:")
|
||||
stringBuilder.append(typeInfo.external)
|
||||
stringBuilder.append("\n关联的自动提示:")
|
||||
stringBuilder.append(typeInfo.list)
|
||||
stringBuilder.append("\n光标偏差:")
|
||||
stringBuilder.append(typeInfo.offset)
|
||||
stringBuilder.append("\n标签:")
|
||||
stringBuilder.append(typeInfo.tag)
|
||||
stringBuilder.append("\n数据规则:")
|
||||
stringBuilder.append(typeInfo.rule)
|
||||
handler.post {
|
||||
MaterialDialog(context).show {
|
||||
title(text = typeInfo.name + "(开发者模式)").message(text = stringBuilder.toString())
|
||||
.positiveButton(R.string.dialog_ok)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (typeInfo.describe == "@search(code)") {
|
||||
handler.post {
|
||||
MaterialDialog(context).show {
|
||||
title(text = typeInfo.name).message(text = codeInfo.description)
|
||||
.positiveButton(R.string.dialog_ok)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
handler.post {
|
||||
MaterialDialog(context).show {
|
||||
title(text = typeInfo.name).message(text = typeInfo.describe)
|
||||
.positiveButton(R.string.dialog_ok)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
resultView.versionView.text =
|
||||
versionMap?.get(codeInfo.addVersion) ?: codeInfo.addVersion.toString()
|
||||
return resultView.root
|
||||
}
|
||||
|
||||
override fun isChildSelectable(groupPosition: Int, childPosition: Int): Boolean {
|
||||
return true
|
||||
}
|
||||
}
|
|
@ -1,225 +0,0 @@
|
|||
package com.coldmint.rust.pro.adapters
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.graphics.Color
|
||||
import android.os.Handler
|
||||
import android.os.Looper
|
||||
import android.text.SpannableStringBuilder
|
||||
import android.text.Spanned
|
||||
import android.text.style.BackgroundColorSpan
|
||||
import android.text.style.ForegroundColorSpan
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.TextView
|
||||
import androidx.core.view.isVisible
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.afollestad.materialdialogs.MaterialDialog
|
||||
import com.coldmint.rust.core.database.code.CodeDataBase
|
||||
import com.coldmint.rust.core.database.code.CodeInfo
|
||||
import com.coldmint.rust.core.tool.LineParser
|
||||
import com.coldmint.rust.pro.R
|
||||
import com.coldmint.rust.pro.base.BaseVh
|
||||
import com.coldmint.rust.pro.databinding.CodeTableItemBinding
|
||||
import com.coldmint.rust.pro.dialog.MaterialBottomDialog
|
||||
import com.coldmint.rust.pro.tool.AppSettings
|
||||
import com.coldmint.rust.pro.tool.GlobalMethod
|
||||
import com.google.android.material.chip.Chip
|
||||
import java.util.concurrent.Executors
|
||||
|
||||
class CodeTableItemAdapter(val recyclerView: RecyclerView,
|
||||
var list: List<CodeInfo>) : RecyclerView.Adapter<BaseVh<CodeTableItemBinding>>() {
|
||||
|
||||
private val lineParser = LineParser()
|
||||
|
||||
init {
|
||||
lineParser.symbol = ","
|
||||
}
|
||||
|
||||
var labelFunction: ((Int, View, String) -> Unit)? = null
|
||||
var versionMap: HashMap<Int, String>? = null
|
||||
var typeNameMap: HashMap<String, String>? = null
|
||||
var sectionMap: HashMap<String, String>? = null
|
||||
private val executorService by lazy {
|
||||
Executors.newSingleThreadExecutor()
|
||||
}
|
||||
private val developerMode by lazy {
|
||||
AppSettings
|
||||
.getValue(AppSettings.Setting.DeveloperMode, false)
|
||||
}
|
||||
|
||||
//在list查找是否有这个关键字
|
||||
fun search(keyword: String) {
|
||||
CodeTableAdapter.pickString = keyword
|
||||
CodeTableAdapter.pick = 0
|
||||
CodeTableAdapter.picklist.clear()
|
||||
for (i in list.indices) {
|
||||
if (list[i].translate.contains(keyword) || list[i].description.contains(keyword) || list[i].code.contains(keyword)) {
|
||||
CodeTableAdapter.picklist.add(i)
|
||||
}
|
||||
}
|
||||
(recyclerView.layoutManager as LinearLayoutManager).scrollToPositionWithOffset(CodeTableAdapter.pick, 0)
|
||||
notifyDataSetChanged()
|
||||
}
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseVh<CodeTableItemBinding> {
|
||||
return BaseVh(CodeTableItemBinding.inflate(LayoutInflater.from(parent.context), parent, false))
|
||||
}
|
||||
|
||||
override fun getItemCount(): Int {
|
||||
return list.size
|
||||
}
|
||||
|
||||
private fun contains(string: String, textView: TextView) {
|
||||
if (string.contains(CodeTableAdapter.pickString)) {
|
||||
val spannableText = SpannableStringBuilder(string)
|
||||
val highlightWord = CodeTableAdapter.pickString
|
||||
val start = string.indexOf(highlightWord)
|
||||
val end = start + highlightWord.length
|
||||
if (start != -1) {
|
||||
// 设置文字颜色
|
||||
val colorSpan = ForegroundColorSpan(Color.RED)
|
||||
spannableText.setSpan(colorSpan, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
|
||||
// 设置背景颜色
|
||||
val backgroundSpan = BackgroundColorSpan(Color.YELLOW)
|
||||
spannableText.setSpan(backgroundSpan, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
|
||||
}
|
||||
textView.text = spannableText
|
||||
} else {
|
||||
textView.text = string
|
||||
}
|
||||
}
|
||||
|
||||
private fun containsB(string: String, textView: TextView) {
|
||||
if (string.contains(CodeTableAdapter.pickString)) {
|
||||
val spannableText = SpannableStringBuilder(string)
|
||||
val highlightWord = CodeTableAdapter.pickString
|
||||
val start = string.indexOf(highlightWord)
|
||||
val end = start + highlightWord.length
|
||||
if (start != -1) {
|
||||
// 设置文字颜色
|
||||
val colorSpan = ForegroundColorSpan(Color.RED)
|
||||
spannableText.setSpan(colorSpan, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
|
||||
// 设置背景颜色
|
||||
val backgroundSpan = BackgroundColorSpan(Color.BLUE)
|
||||
spannableText.setSpan(backgroundSpan, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
|
||||
}
|
||||
textView.text = spannableText
|
||||
} else {
|
||||
textView.text = string
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("StringFormatInvalid")
|
||||
override fun onBindViewHolder(holder: BaseVh<CodeTableItemBinding>, position: Int) {
|
||||
val context = holder.itemView.context
|
||||
val resultView: CodeTableItemBinding = holder.binging
|
||||
val codeInfo = list[position]
|
||||
|
||||
contains(codeInfo.description, resultView.descriptionView)
|
||||
resultView.descriptionView.setOnClickListener {
|
||||
GlobalMethod.copyText(it.context, codeInfo.description, it)
|
||||
}
|
||||
contains(codeInfo.translate, resultView.titleView)
|
||||
resultView.titleView.setOnClickListener {
|
||||
GlobalMethod.copyText(it.context, codeInfo.translate, it)
|
||||
}
|
||||
val demo = codeInfo.demo
|
||||
resultView.imageView.isVisible = demo.isNotBlank()
|
||||
resultView.imageView.setOnClickListener {
|
||||
val materialBottomDialog = MaterialBottomDialog(it.context)
|
||||
materialBottomDialog.setTitle(R.string.code_demo)
|
||||
materialBottomDialog.setMessage(demo)
|
||||
materialBottomDialog.show()
|
||||
}
|
||||
contains(codeInfo.code, resultView.subTitleView)
|
||||
resultView.subTitleView.setOnClickListener {
|
||||
GlobalMethod.copyText(it.context, codeInfo.code, it)
|
||||
}
|
||||
|
||||
resultView.valueTypeView.text = typeNameMap?.get(codeInfo.type) ?: codeInfo.type
|
||||
lineParser.text = codeInfo.section
|
||||
|
||||
var isNotEmpty = false
|
||||
lineParser.analyse { lineNum, lineData, isEnd ->
|
||||
isNotEmpty = true
|
||||
val text = sectionMap?.get(lineData) ?: lineData
|
||||
val chip = Chip(context)
|
||||
chip.text = text
|
||||
chip.setOnClickListener {
|
||||
labelFunction?.invoke(lineNum, it, text)
|
||||
}
|
||||
// resultView.chipGroup.addView(chip)
|
||||
true
|
||||
}
|
||||
|
||||
// resultView.chipGroup.isVisible = isNotEmpty
|
||||
resultView.valueTypeView.setOnClickListener {
|
||||
val handler = Handler(Looper.getMainLooper())
|
||||
executorService.submit {
|
||||
val codeDataBase = CodeDataBase.getInstance(context)
|
||||
val typeInfo = codeDataBase.getValueTypeDao().findTypeByType(codeInfo.type)
|
||||
|
||||
if (typeInfo == null) {
|
||||
handler.post {
|
||||
handler.post {
|
||||
MaterialDialog(context).show {
|
||||
title(text = codeInfo.type).message(
|
||||
text = String.format(
|
||||
context.getString(
|
||||
R.string.unknown_type
|
||||
), codeInfo.type
|
||||
)
|
||||
)
|
||||
.positiveButton(R.string.dialog_ok)
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (developerMode) {
|
||||
val stringBuilder = StringBuilder()
|
||||
stringBuilder.append("介绍:")
|
||||
stringBuilder.append(typeInfo.describe)
|
||||
stringBuilder.append("\n附加信息:")
|
||||
stringBuilder.append(typeInfo.external)
|
||||
stringBuilder.append("\n关联的自动提示:")
|
||||
stringBuilder.append(typeInfo.list)
|
||||
stringBuilder.append("\n光标偏差:")
|
||||
stringBuilder.append(typeInfo.offset)
|
||||
stringBuilder.append("\n标签:")
|
||||
stringBuilder.append(typeInfo.tag)
|
||||
stringBuilder.append("\n数据规则:")
|
||||
stringBuilder.append(typeInfo.rule)
|
||||
handler.post {
|
||||
MaterialDialog(context).show {
|
||||
title(text = typeInfo.name + "(开发者模式)").message(text = stringBuilder.toString())
|
||||
.positiveButton(R.string.dialog_ok)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (typeInfo.describe == "@search(code)") {
|
||||
handler.post {
|
||||
MaterialDialog(context).show {
|
||||
title(text = typeInfo.name).message(text = codeInfo.description)
|
||||
.positiveButton(R.string.dialog_ok)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
handler.post {
|
||||
MaterialDialog(context).show {
|
||||
title(text = typeInfo.name).message(text = typeInfo.describe)
|
||||
.positiveButton(R.string.dialog_ok)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
resultView.versionView.text =
|
||||
versionMap?.get(codeInfo.addVersion) ?: codeInfo.addVersion.toString()
|
||||
|
||||
|
||||
}
|
||||
}
|
|
@ -1,97 +1,32 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:card_view="http://schemas.android.com/tools"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:fitsSystemWindows="true">
|
||||
android:fitsSystemWindows="true"
|
||||
tools:context=".ActivateActivity">
|
||||
|
||||
<com.google.android.material.appbar.AppBarLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:fitsSystemWindows="true">
|
||||
|
||||
<com.google.android.material.card.MaterialCardView
|
||||
style="@style/Widget.Material3.CardView.Elevated"
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:id="@+id/toolbar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="12dp">
|
||||
android:layout_height="?attr/actionBarSize" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginHorizontal="6dp"
|
||||
android:gravity="center">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/back"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="?android:selectableItemBackgroundBorderless"
|
||||
android:focusable="true"
|
||||
android:src="@drawable/md_nav_back"
|
||||
android:tint="?android:attr/colorForeground"
|
||||
tools:ignore="ContentDescription" />
|
||||
|
||||
<EditText
|
||||
android:id="@+id/edittext"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:autofillHints="text"
|
||||
android:background="@null"
|
||||
android:drawableEnd="@drawable/ic_search_black_24dp"
|
||||
android:hint="@string/search"
|
||||
android:imeOptions="actionSearch"
|
||||
android:inputType="text"
|
||||
android:minHeight="48dp"
|
||||
android:padding="10dp"
|
||||
android:singleLine="true"
|
||||
tools:ignore="TextContrastCheck,VisualLintTextFieldSize" />
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/search_pick"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginHorizontal="6dp"
|
||||
android:gravity="end"
|
||||
android:orientation="horizontal"
|
||||
android:visibility="gone"
|
||||
tools:visibility="visible">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/listTop"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="3dp"
|
||||
android:padding="9dp"
|
||||
android:background="?selectableItemBackground"
|
||||
android:src="@drawable/animator_expand_on" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/listButtom"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="?selectableItemBackground"
|
||||
android:padding="9dp"
|
||||
android:src="@drawable/animator_expand_off" />
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
|
||||
</com.google.android.material.card.MaterialCardView>
|
||||
</com.google.android.material.appbar.AppBarLayout>
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginHorizontal="6dp"
|
||||
android:layout_marginTop="3dp"
|
||||
android:layout_marginLeft="16dp"
|
||||
android:layout_marginTop="8dp"
|
||||
android:layout_marginRight="16dp"
|
||||
android:animateLayoutChanges="true"
|
||||
android:gravity="center"
|
||||
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior">
|
||||
|
||||
|
@ -99,52 +34,22 @@
|
|||
<ProgressBar
|
||||
android:id="@+id/progressBar"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
android:layout_height="wrap_content" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/displayView"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/unable_open_database"
|
||||
android:visibility="gone"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/progressBar"
|
||||
tools:visibility="visible" />
|
||||
android:visibility="gone" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="horizontal"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent">
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
<ExpandableListView
|
||||
android:id="@+id/expandableListView"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="1" />
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="top"
|
||||
android:visibility="gone" />
|
||||
|
||||
<com.google.android.material.divider.MaterialDivider
|
||||
android:layout_width="1dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginHorizontal="3dp"
|
||||
android:layout_marginVertical="3dp" />
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/code_recycler_b"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="3"
|
||||
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
|
||||
</LinearLayout>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
22
app/src/main/res/layout/code_table_group.xml
Normal file
22
app/src/main/res/layout/code_table_group.xml
Normal file
|
@ -0,0 +1,22 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:padding="16dp">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/nameView"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="16dp"
|
||||
android:text="表名"
|
||||
android:textSize="16dp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/numView"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentRight="true"
|
||||
android:text="代码数" />
|
||||
|
||||
</RelativeLayout>
|
|
@ -61,7 +61,7 @@
|
|||
android:layout_marginLeft="8dp"
|
||||
android:layout_toRightOf="@id/valueTypeView"
|
||||
android:text="版本信息" />
|
||||
<!--
|
||||
|
||||
<com.google.android.material.chip.ChipGroup
|
||||
android:id="@+id/chipGroup"
|
||||
android:layout_width="match_parent"
|
||||
|
@ -69,7 +69,8 @@
|
|||
android:layout_below="@id/valueTypeView"
|
||||
android:layout_marginTop="8dp"
|
||||
app:singleLine="false">
|
||||
</com.google.android.material.chip.ChipGroup>-->
|
||||
|
||||
</com.google.android.material.chip.ChipGroup>
|
||||
|
||||
|
||||
</RelativeLayout>
|
Loading…
Reference in New Issue
Block a user