亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android?ChipGroup收起折疊效果怎么實現

發布時間:2022-11-23 09:53:43 來源:億速云 閱讀:120 作者:iii 欄目:開發技術

這篇文章主要介紹“Android ChipGroup收起折疊效果怎么實現”,在日常操作中,相信很多人在Android ChipGroup收起折疊效果怎么實現問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Android ChipGroup收起折疊效果怎么實現”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

一、先上效果圖

借用某東App的效果,如下。

折疊時的效果:

Android?ChipGroup收起折疊效果怎么實現

展開時的效果:

Android?ChipGroup收起折疊效果怎么實現

二、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"
    
    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 &gt; -1) id else mClickChipId

總結: 這個重要的是實現思路,核心代碼也貼出來了,理解了實現起來就不難。

到此,關于“Android ChipGroup收起折疊效果怎么實現”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

义乌市| 社旗县| 清丰县| 工布江达县| 浙江省| 米易县| 樟树市| 泰兴市| 宝兴县| 沾益县| 西平县| 昭平县| 黎平县| 扬中市| 武陟县| 东阳市| 神农架林区| 田东县| 绥滨县| 博客| 唐山市| 琼海市| 托里县| 石屏县| 龙口市| 武义县| 城口县| 垣曲县| 隆回县| 赣榆县| 红河县| 浮山县| 宜兰市| 象山县| 云南省| 吕梁市| 滕州市| 海口市| 岳池县| 互助| 桐柏县|