diff --git a/module_base/src/main/java/com/lukouguoji/module_base/bean/GjjAirManifest.kt b/module_base/src/main/java/com/lukouguoji/module_base/bean/GjjAirManifest.kt index 5eafa3b..802b353 100644 --- a/module_base/src/main/java/com/lukouguoji/module_base/bean/GjjAirManifest.kt +++ b/module_base/src/main/java/com/lukouguoji/module_base/bean/GjjAirManifest.kt @@ -15,6 +15,10 @@ data class GjjAirManifest( // 选中状态(用于列表多选) val checked: ObservableBoolean = ObservableBoolean(false) + // 展开/收起状态(用于子列表显示控制) + @Transient + val showMore: ObservableBoolean = ObservableBoolean(false) + // 兼容现有API的isSelected属性 var isSelected: Boolean get() = checked.get() diff --git a/module_gjj/src/main/java/com/lukouguoji/gjj/holder/IntArrAirManifestSubViewHolder.kt b/module_gjj/src/main/java/com/lukouguoji/gjj/holder/IntArrAirManifestSubViewHolder.kt new file mode 100644 index 0000000..da545b2 --- /dev/null +++ b/module_gjj/src/main/java/com/lukouguoji/gjj/holder/IntArrAirManifestSubViewHolder.kt @@ -0,0 +1,36 @@ +package com.lukouguoji.gjj.holder + +import android.view.View +import androidx.recyclerview.widget.RecyclerView +import com.lukouguoji.gjj.databinding.ItemIntArrAirManifestSubBinding +import com.lukouguoji.module_base.base.BaseViewHolder +import com.lukouguoji.module_base.bean.GjjAirManifest +import com.lukouguoji.module_base.bean.GjjImportManifest + +/** + * 国际进港原始舱单 - 分单子列表 ViewHolder + */ +class IntArrAirManifestSubViewHolder(view: View) : + BaseViewHolder(view) { + + override fun onBind(item: Any?, position: Int) { + val bean = getItemBean(item) ?: return + binding.bean = bean + binding.position = position + binding.executePendingBindings() + + // 单选框点击切换选择状态 + binding.ivCheckbox.setOnClickListener { + val newCheckedState = !bean.checked.get() + bean.checked.set(newCheckedState) + binding.executePendingBindings() + + // 反向联动主列表项(勾选子项时自动勾选父项) + if (newCheckedState) { + val recyclerView = itemView.parent as? RecyclerView ?: return@setOnClickListener + val parentBean = recyclerView.tag as? GjjAirManifest ?: return@setOnClickListener + parentBean.checked.set(true) + } + } + } +} diff --git a/module_gjj/src/main/java/com/lukouguoji/gjj/holder/IntArrAirManifestViewHolder.kt b/module_gjj/src/main/java/com/lukouguoji/gjj/holder/IntArrAirManifestViewHolder.kt index e13b94d..1ff4376 100644 --- a/module_gjj/src/main/java/com/lukouguoji/gjj/holder/IntArrAirManifestViewHolder.kt +++ b/module_gjj/src/main/java/com/lukouguoji/gjj/holder/IntArrAirManifestViewHolder.kt @@ -1,9 +1,12 @@ package com.lukouguoji.gjj.holder import android.view.View +import com.lukouguoji.gjj.R import com.lukouguoji.gjj.databinding.ItemIntArrAirManifestBinding +import com.lukouguoji.module_base.adapter.setCommonAdapter import com.lukouguoji.module_base.base.BaseViewHolder import com.lukouguoji.module_base.bean.GjjAirManifest +import com.lukouguoji.module_base.ktx.refresh /** * 国际进港原始舱单 ViewHolder @@ -23,10 +26,30 @@ class IntArrAirManifestViewHolder(view: View) : // 整卡点击 - 跳转详情页 notifyItemClick(position, binding.ll) - // 图标点击 - 切换选择状态(拦截,不触发卡片点击) + // 图标点击 - 切换选择状态(联动子列表) binding.ivIcon.setOnClickListener { - bean.checked.set(!bean.checked.get()) + val newCheckedState = !bean.checked.get() + bean.checked.set(newCheckedState) + // 联动子列表选中状态 + bean.haWbList?.forEach { sub -> sub.checked.set(newCheckedState) } binding.executePendingBindings() + binding.rvSub.adapter?.notifyDataSetChanged() } + + // 展开按钮点击事件 + binding.ivShow.setOnClickListener { + bean.showMore.set(!bean.showMore.get()) + } + + // 初始化分单子列表 RecyclerView + setCommonAdapter( + binding.rvSub, + IntArrAirManifestSubViewHolder::class.java, + R.layout.item_int_arr_air_manifest_sub + ) + + // 设置父Bean引用(用于子列表反向联动) + binding.rvSub.tag = bean + binding.rvSub.refresh(bean.haWbList ?: emptyList()) } } diff --git a/module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/IntArrAirManifestViewModel.kt b/module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/IntArrAirManifestViewModel.kt index 61ec57c..364fe26 100644 --- a/module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/IntArrAirManifestViewModel.kt +++ b/module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/IntArrAirManifestViewModel.kt @@ -41,11 +41,17 @@ class IntArrAirManifestViewModel : BasePageViewModel() { // ========== 全选状态 ========== val isAllChecked = MutableLiveData(false) + // ========== 全部展开状态 ========== + val isAllExpanded = MutableLiveData(false) + init { - // 监听全选状态,自动更新所有列表项 + // 监听全选状态,自动更新所有列表项(含子列表) isAllChecked.observeForever { checked -> val list = pageModel.rv?.commonAdapter()?.items as? List ?: return@observeForever - list.forEach { it.checked.set(checked) } + list.forEach { + it.checked.set(checked) + it.haWbList?.forEach { sub -> sub.checked.set(checked) } + } pageModel.rv?.commonAdapter()?.notifyDataSetChanged() } } @@ -69,12 +75,30 @@ class IntArrAirManifestViewModel : BasePageViewModel() { // 切换全选状态 val shouldCheckAll = !isAllChecked.value!! - list.forEach { it.checked.set(shouldCheckAll) } + list.forEach { + it.checked.set(shouldCheckAll) + it.haWbList?.forEach { sub -> sub.checked.set(shouldCheckAll) } + } isAllChecked.value = shouldCheckAll pageModel.rv?.commonAdapter()?.notifyDataSetChanged() } + /** + * 全部展开/收起 + */ + fun toggleAllExpand() { + val shouldExpand = !isAllExpanded.value!! + isAllExpanded.value = shouldExpand + val list = pageModel.rv?.commonAdapter()?.items as? List ?: return + list.forEach { bean -> + if (!bean.haWbList.isNullOrEmpty()) { + bean.showMore.set(shouldExpand) + } + } + pageModel.rv?.commonAdapter()?.notifyDataSetChanged() + } + /** * 扫码运单号 */ @@ -268,6 +292,7 @@ class IntArrAirManifestViewModel : BasePageViewModel() { // 获取列表(带Loading,接口直接返回PageInfo,无BaseResultBean包装) launchLoadingCollect({ NetApply.api.getIntArrAirManifestList(listParams) }) { onSuccess = { result -> + isAllExpanded.value = false pageModel.handleListBean(result.toBaseListBean()) } } diff --git a/module_gjj/src/main/res/layout/activity_int_arr_air_manifest.xml b/module_gjj/src/main/res/layout/activity_int_arr_air_manifest.xml index 18f09e5..d684fae 100644 --- a/module_gjj/src/main/res/layout/activity_int_arr_air_manifest.xml +++ b/module_gjj/src/main/res/layout/activity_int_arr_air_manifest.xml @@ -87,6 +87,14 @@ android:padding="2dp" android:src="@drawable/img_search" /> + + diff --git a/module_gjj/src/main/res/layout/item_int_arr_air_manifest.xml b/module_gjj/src/main/res/layout/item_int_arr_air_manifest.xml index 7cc5465..033925a 100644 --- a/module_gjj/src/main/res/layout/item_int_arr_air_manifest.xml +++ b/module_gjj/src/main/res/layout/item_int_arr_air_manifest.xml @@ -19,260 +19,414 @@ type="Integer" /> - + + android:orientation="vertical"> - - - - - + + android:background="@drawable/bg_item" + android:orientation="horizontal" + android:padding="10dp"> - - + + - + + + + + android:layout_width="match_parent" + android:layout_height="wrap_content"> - + + android:layout_weight="1.0" + android:gravity="center_vertical"> - + + + + + + + + android:layout_weight="0.8" + android:gravity="center_vertical"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + android:layout_marginTop="10dp"> - + + android:layout_weight="1.0" + android:gravity="center_vertical"> - + + + + + + + + android:layout_weight="0.8" + android:gravity="center_vertical"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + - + + - + - + + - - + + - - - - - - - - - - - - - - - - - - - + + android:layout_marginVertical="10dp" + android:orientation="horizontal" + android:paddingHorizontal="10dp"> - - + + + android:gravity="center" + android:text="分单号" + android:textColor="@color/text_normal" + android:textSize="14sp" + android:textStyle="bold" /> - - - - - - - - + android:gravity="center" + android:text="件数" + android:textColor="@color/text_normal" + android:textSize="14sp" + android:textStyle="bold" /> - - - - - - - - + android:gravity="center" + android:text="重量" + android:textColor="@color/text_normal" + android:textSize="14sp" + android:textStyle="bold" /> - - - - - - - - - - - - - - - - - + android:gravity="center" + android:text="申报状态" + android:textColor="@color/text_normal" + android:textSize="14sp" + android:textStyle="bold" /> - + - + - + - + + + + + + + + + + - - - - + diff --git a/module_gjj/src/main/res/layout/item_int_arr_air_manifest_sub.xml b/module_gjj/src/main/res/layout/item_int_arr_air_manifest_sub.xml new file mode 100644 index 0000000..f29b69d --- /dev/null +++ b/module_gjj/src/main/res/layout/item_int_arr_air_manifest_sub.xml @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +