網站首頁 編程語言 正文
一、先上效果圖
借用某東App的效果,如下。
折疊時的效果:
展開時的效果:
二、ChipGroup和Chip
chipGroup和chip之前寫過博客,可移步Android Material 常用組件,看關于chip和chipGroup的部分,建議一定要看,因為里面還挺多坑的。這里簡單貼下chip和chipGroup的代碼:
ChipGroup:
<com.google.android.material.chip.ChipGroup android:id="@+id/chip_group" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/size_15dp" app:chipSpacingHorizontal="@dimen/size_9dp" app:chipSpacingVertical="@dimen/size_8dp" app:singleSelection="true" />
Chip: 需要定義三種Chip的布局:箭頭朝上的、箭頭朝下的、普通展示文字的,如果能復用定義一種也行,這里簡單貼一種:
<?xml version="1.0" encoding="utf-8"?> <com.google.android.material.chip.Chip xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/chip" style="@style/Widget.MaterialComponents.Chip.Filter" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/login_model" android:textSize="@dimen/font_12sp" android:theme="@style/Theme.MaterialComponents" app:checkedIconVisible="false" app:chipBackgroundColor="@color/printer_unused_reason" app:chipMinHeight="@dimen/size_24dp" app:chipMinTouchTargetSize="0dp" />
三、在ChipGroup中動態添加Chip
這個比較簡單,inflate后add即可,如下:
//添加Chip for (index in 0 until size) { val chip = layoutInflater.inflate( R.layout.common_chip_end, mViewBind.chipGroup, false) as Chip chip.text = mWordList[index] //動態添加ID chip.id = index mViewBind.chipGroup.addView(chip) }
四、找到每個Chip位于的行數
這個需求一般會要求顯示固定的行數(比如效果圖中某東App的二行),然后顯示有向下箭頭的Chip,點擊后可以展開,那么如何找到固定行數最后一行的最后一個Chip呢? 不用擔心ChipGruop
(的父類)有給我們提供Api:
/** Gets the row index of the child, primarily for accessibility. */ public int getRowIndex(@NonNull View child) { Object index = child.getTag(R.id.row_index_key); if (!(index instanceof Integer)) { return -1; } return (int) index; }
于是當我們將添加到ChipGroup的Chip調用該Api后就知道每個Chip位于哪一行了。
五、實現思路
我們已經找到每個Chip位于第幾行,自然我們就知道固定行數的最后一行的最后一個Chip是誰,我們替換該Chip為向下箭頭的Chip就可以完成折疊的效果。
展開的效果就很簡單了,加上向上箭頭的Chip即可。
六、需要注意的問題
1、Chip的復用問題
很遺憾,chip不能復用,每次展開和折疊都會先清除ChipGroup中的Chip然后再添加,如果邊清除邊添加同一個Chip就會報錯,所以清除所有Chip后還是要用inflate重新創建新的Chip。
//清除 mViewBind.chipGroup.removeAllViews() //重新inflate val chip = layoutInflater.inflate( R.layout.common_chip_end, mViewBind.chipGroup, false) as Chip //添加 mViewBind.chipGroup.addView(endChip)
2、Chip的ID設置
如果在for循環中添加chip,可以直接用Chip的數據源的索引(要展示的文本集合的索引),這樣我們獲取Chip的內容就很簡單。如果是一些特殊的Chip,我們可以單獨inflate單獨添加,單獨設置ID,比如向上向下箭頭的Chip。
//設置箭頭的ID arrowUpChip.id = ARROW_UP_CHIP_ID arrowDownChip.id = ARROW_DOWN_CHIP_ID //處理Chip的點擊事件 mViewBind.chipGroup.setOnCheckedChangeListener { group, checkedId -> //記錄點擊的ID mClickChipId = if (checkedId > -1) checkedId else mClickChipId when (mClickChipId) { ARROW_DOWN_CHIP_ID -> { //箭頭向下的Chip的點擊 enlargeChipList(true) } ARROW_UP_CHIP_ID -> { //箭頭向上的Chip的點擊 enlargeChipList(false) } else -> { //其他 val text = mWordList[mClickChipId] } } }
3、點擊同一個Chip返回的ID為-1的問題
ChipGroup有個坑就是重復點擊同一個Chip,第一次返回的Chip的ID正常,后面返回的Chip的ID都是-1,所以需要記錄首次點擊的Chip的ID,如果你發現返回的ID為-1,那么就是用戶點擊了上次的Chip,這一點要注意。
//記錄點擊的ID mClickChipId = if (checkedId > -1) id else mClickChipId
總結: 這個重要的是實現思路,核心代碼也貼出來了,理解了實現起來就不難。寫這篇文章主要是是記錄一下。
原文鏈接:https://juejin.cn/post/7148363145667411975
相關推薦
- 2022-07-26 用VScode編寫C++大型項目的方法步驟_C 語言
- 2022-04-20 Android實現將View轉化為圖片并保存到本地_Android
- 2022-05-09 Docker?Overlay2磁盤空間占用過大清理的方法實現_docker
- 2022-12-14 Jetpack?Compose?雙指拖拽實現詳解_Android
- 2022-07-17 baselines示例程序train_cartpole.py的ImportError_python
- 2023-07-05 React解決setState異步帶來的多次修改合一和修改后立即使用沒有變化問題
- 2022-10-28 Go語言開發保證并發安全實例詳解_Golang
- 2022-06-06 在使用element-ui中的el-table組件時,怎么自定義合并表頭和合并行
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支