diff --git a/app/src/main/java/com/casic/br/ktd/adapter/TaskAdapter.kt b/app/src/main/java/com/casic/br/ktd/adapter/TaskAdapter.kt index 17ebf9c..b9186e6 100644 --- a/app/src/main/java/com/casic/br/ktd/adapter/TaskAdapter.kt +++ b/app/src/main/java/com/casic/br/ktd/adapter/TaskAdapter.kt @@ -6,23 +6,26 @@ import android.view.LayoutInflater import android.view.ViewGroup import android.widget.CheckBox -import androidx.annotation.LayoutRes import androidx.recyclerview.widget.RecyclerView import com.casic.br.ktd.R import com.casic.br.ktd.holder.SwipeViewHolder +import com.casic.br.ktd.model.TaskListModel +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.convertDrawable import com.pengxh.kt.lite.extensions.dp2px import com.qmuiteam.qmui.recyclerView.QMUISwipeAction -abstract class TaskAdapter( - ctx: Context, @LayoutRes private val xmlResource: Int, private val dataRows: MutableList -) : RecyclerView.Adapter() { +class TaskAdapter( + private val ctx: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { private val kTag = "TaskAdapter" + private val TYPE_TOP_TITLE = 0 + private val TYPE_ITEM_DATA = 1 private var inflater: LayoutInflater = LayoutInflater.from(ctx) private var multipleSelected = mutableSetOf() - private var selectedItems = ArrayList() + private var selectedItems = ArrayList() private var deleteAction = QMUISwipeAction.ActionBuilder() .icon(R.mipmap.delete_task.convertDrawable(ctx)) @@ -40,58 +43,119 @@ .backgroundColor(R.color.themeColor.convertColor(ctx)) .build() - override fun getItemCount(): Int = dataRows.size + //标题行,需要+1 + override fun getItemCount(): Int = dataRows.size + 1 - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SwipeViewHolder { - val view = inflater.inflate(xmlResource, parent, false) - val swipeViewHolder = SwipeViewHolder(view) - swipeViewHolder.addSwipeAction(deleteAction) - swipeViewHolder.addSwipeAction(handleAction) - return swipeViewHolder + override fun getItemViewType(position: Int): Int { + return if (position == 0) { + TYPE_TOP_TITLE + } else { + TYPE_ITEM_DATA + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + if (viewType == TYPE_TOP_TITLE) { + return ViewHolder(inflater.inflate(R.layout.item_task_rv_l_title, parent, false)) + } else { + val view = inflater.inflate(R.layout.item_task_rv_l, parent, false) + val swipeViewHolder = SwipeViewHolder(view) + swipeViewHolder.addSwipeAction(deleteAction) + swipeViewHolder.addSwipeAction(handleAction) + return swipeViewHolder + } } @SuppressLint("NotifyDataSetChanged") - fun setRefreshData(dataRows: MutableList) { + fun setRefreshData(dataRows: MutableList) { this.dataRows.clear() this.dataRows.addAll(dataRows) notifyDataSetChanged() } - fun setLoadMoreData(dataRows: MutableList) { + fun setLoadMoreData(dataRows: MutableList) { this.dataRows.addAll(dataRows) notifyItemRangeInserted(this.dataRows.size, dataRows.size) } - override fun onBindViewHolder(holder: SwipeViewHolder, position: Int) { - val multiSelectCheckBox: CheckBox = holder.itemView.findViewById(R.id.multiSelectCheckBox) - - multiSelectCheckBox.isSelected = multipleSelected.contains(position) - multiSelectCheckBox.setOnClickListener { - if (multipleSelected.contains(position)) { - multipleSelected.remove(position) - selectedItems.remove(dataRows[position]) - holder.itemView.isSelected = false + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder is SwipeViewHolder) { + //绑定数据。标题已经把position=0占用,但是size+1,所以需要数据绑定实际position-1 + val item = dataRows[position - 1] + val beginDate = if (item.beginDate.isNullOrBlank()) { + "时间未知" } else { - multipleSelected.add(position) - selectedItems.add(dataRows[position]) - holder.itemView.isSelected = true + item.beginDate } - itemCheckedListener?.onItemChecked(selectedItems) + val endDate = if (item.endDate.isNullOrBlank()) { + "时间未知" + } else { + item.endDate + } + + val km = if (item.km.isNullOrBlank()) { + "0" + } else { + item.km + } + + val taskState: String + if (item.status == "0") { + taskState = "进行中" + holder.setBackgroundColor(R.id.taskStateView, R.color.green.convertColor(ctx)) + } else { + taskState = "已完成" + holder.setBackgroundColor(R.id.taskStateView, R.color.themeColor.convertColor(ctx)) + } + + holder.setText(R.id.taskCodeView, item.taskCode) + .setText(R.id.taskNameView, item.taskName) + .setText(R.id.startTimeView, beginDate) + .setText(R.id.endTimeView, endDate) + .setText(R.id.pathLengthView, km) + .setText(R.id.taskStateView, taskState) + + //item背景色 + if (position % 2 == 0) { + holder.setBackgroundColor(R.id.rootView, Color.parseColor("#EEF1F6")) + } + + //多选 + val multiSelectCheckBox: CheckBox = + holder.itemView.findViewById(R.id.multiSelectCheckBox) + + multiSelectCheckBox.isSelected = multipleSelected.contains(position) + multiSelectCheckBox.setOnClickListener { + if (multipleSelected.contains(position)) { + multipleSelected.remove(position) + selectedItems.remove(dataRows[position]) + holder.itemView.isSelected = false + } else { + multipleSelected.add(position) + selectedItems.add(dataRows[position]) + holder.itemView.isSelected = true + } + + itemCheckedListener?.onItemChecked(selectedItems) + } + } else { + (holder as ViewHolder).setText(R.id.taskCodeView, "任务编号") + .setText(R.id.taskNameView, "巡检任务名称") + .setText(R.id.startTimeView, "开始时间") + .setText(R.id.endTimeView, "结束时间") + .setText(R.id.pathLengthView, "巡检公里") + .setText(R.id.taskStateView, "巡检状态") } - - convertView(holder, position, dataRows[position]) } - abstract fun convertView(viewHolder: SwipeViewHolder, position: Int, item: T) + private var itemCheckedListener: OnItemCheckedListener? = null - private var itemCheckedListener: OnItemCheckedListener? = null - - interface OnItemCheckedListener { - fun onItemChecked(items: ArrayList) + interface OnItemCheckedListener { + fun onItemChecked(items: ArrayList) } - fun setOnItemCheckedListener(listener: OnItemCheckedListener?) { + fun setOnItemCheckedListener(listener: OnItemCheckedListener) { itemCheckedListener = listener } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ktd/adapter/TaskAdapter.kt b/app/src/main/java/com/casic/br/ktd/adapter/TaskAdapter.kt index 17ebf9c..b9186e6 100644 --- a/app/src/main/java/com/casic/br/ktd/adapter/TaskAdapter.kt +++ b/app/src/main/java/com/casic/br/ktd/adapter/TaskAdapter.kt @@ -6,23 +6,26 @@ import android.view.LayoutInflater import android.view.ViewGroup import android.widget.CheckBox -import androidx.annotation.LayoutRes import androidx.recyclerview.widget.RecyclerView import com.casic.br.ktd.R import com.casic.br.ktd.holder.SwipeViewHolder +import com.casic.br.ktd.model.TaskListModel +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.convertDrawable import com.pengxh.kt.lite.extensions.dp2px import com.qmuiteam.qmui.recyclerView.QMUISwipeAction -abstract class TaskAdapter( - ctx: Context, @LayoutRes private val xmlResource: Int, private val dataRows: MutableList -) : RecyclerView.Adapter() { +class TaskAdapter( + private val ctx: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { private val kTag = "TaskAdapter" + private val TYPE_TOP_TITLE = 0 + private val TYPE_ITEM_DATA = 1 private var inflater: LayoutInflater = LayoutInflater.from(ctx) private var multipleSelected = mutableSetOf() - private var selectedItems = ArrayList() + private var selectedItems = ArrayList() private var deleteAction = QMUISwipeAction.ActionBuilder() .icon(R.mipmap.delete_task.convertDrawable(ctx)) @@ -40,58 +43,119 @@ .backgroundColor(R.color.themeColor.convertColor(ctx)) .build() - override fun getItemCount(): Int = dataRows.size + //标题行,需要+1 + override fun getItemCount(): Int = dataRows.size + 1 - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SwipeViewHolder { - val view = inflater.inflate(xmlResource, parent, false) - val swipeViewHolder = SwipeViewHolder(view) - swipeViewHolder.addSwipeAction(deleteAction) - swipeViewHolder.addSwipeAction(handleAction) - return swipeViewHolder + override fun getItemViewType(position: Int): Int { + return if (position == 0) { + TYPE_TOP_TITLE + } else { + TYPE_ITEM_DATA + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + if (viewType == TYPE_TOP_TITLE) { + return ViewHolder(inflater.inflate(R.layout.item_task_rv_l_title, parent, false)) + } else { + val view = inflater.inflate(R.layout.item_task_rv_l, parent, false) + val swipeViewHolder = SwipeViewHolder(view) + swipeViewHolder.addSwipeAction(deleteAction) + swipeViewHolder.addSwipeAction(handleAction) + return swipeViewHolder + } } @SuppressLint("NotifyDataSetChanged") - fun setRefreshData(dataRows: MutableList) { + fun setRefreshData(dataRows: MutableList) { this.dataRows.clear() this.dataRows.addAll(dataRows) notifyDataSetChanged() } - fun setLoadMoreData(dataRows: MutableList) { + fun setLoadMoreData(dataRows: MutableList) { this.dataRows.addAll(dataRows) notifyItemRangeInserted(this.dataRows.size, dataRows.size) } - override fun onBindViewHolder(holder: SwipeViewHolder, position: Int) { - val multiSelectCheckBox: CheckBox = holder.itemView.findViewById(R.id.multiSelectCheckBox) - - multiSelectCheckBox.isSelected = multipleSelected.contains(position) - multiSelectCheckBox.setOnClickListener { - if (multipleSelected.contains(position)) { - multipleSelected.remove(position) - selectedItems.remove(dataRows[position]) - holder.itemView.isSelected = false + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder is SwipeViewHolder) { + //绑定数据。标题已经把position=0占用,但是size+1,所以需要数据绑定实际position-1 + val item = dataRows[position - 1] + val beginDate = if (item.beginDate.isNullOrBlank()) { + "时间未知" } else { - multipleSelected.add(position) - selectedItems.add(dataRows[position]) - holder.itemView.isSelected = true + item.beginDate } - itemCheckedListener?.onItemChecked(selectedItems) + val endDate = if (item.endDate.isNullOrBlank()) { + "时间未知" + } else { + item.endDate + } + + val km = if (item.km.isNullOrBlank()) { + "0" + } else { + item.km + } + + val taskState: String + if (item.status == "0") { + taskState = "进行中" + holder.setBackgroundColor(R.id.taskStateView, R.color.green.convertColor(ctx)) + } else { + taskState = "已完成" + holder.setBackgroundColor(R.id.taskStateView, R.color.themeColor.convertColor(ctx)) + } + + holder.setText(R.id.taskCodeView, item.taskCode) + .setText(R.id.taskNameView, item.taskName) + .setText(R.id.startTimeView, beginDate) + .setText(R.id.endTimeView, endDate) + .setText(R.id.pathLengthView, km) + .setText(R.id.taskStateView, taskState) + + //item背景色 + if (position % 2 == 0) { + holder.setBackgroundColor(R.id.rootView, Color.parseColor("#EEF1F6")) + } + + //多选 + val multiSelectCheckBox: CheckBox = + holder.itemView.findViewById(R.id.multiSelectCheckBox) + + multiSelectCheckBox.isSelected = multipleSelected.contains(position) + multiSelectCheckBox.setOnClickListener { + if (multipleSelected.contains(position)) { + multipleSelected.remove(position) + selectedItems.remove(dataRows[position]) + holder.itemView.isSelected = false + } else { + multipleSelected.add(position) + selectedItems.add(dataRows[position]) + holder.itemView.isSelected = true + } + + itemCheckedListener?.onItemChecked(selectedItems) + } + } else { + (holder as ViewHolder).setText(R.id.taskCodeView, "任务编号") + .setText(R.id.taskNameView, "巡检任务名称") + .setText(R.id.startTimeView, "开始时间") + .setText(R.id.endTimeView, "结束时间") + .setText(R.id.pathLengthView, "巡检公里") + .setText(R.id.taskStateView, "巡检状态") } - - convertView(holder, position, dataRows[position]) } - abstract fun convertView(viewHolder: SwipeViewHolder, position: Int, item: T) + private var itemCheckedListener: OnItemCheckedListener? = null - private var itemCheckedListener: OnItemCheckedListener? = null - - interface OnItemCheckedListener { - fun onItemChecked(items: ArrayList) + interface OnItemCheckedListener { + fun onItemChecked(items: ArrayList) } - fun setOnItemCheckedListener(listener: OnItemCheckedListener?) { + fun setOnItemCheckedListener(listener: OnItemCheckedListener) { itemCheckedListener = listener } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt index 343991d..4fe2b98 100644 --- a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt +++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt @@ -9,14 +9,12 @@ import com.casic.br.ktd.R import com.casic.br.ktd.adapter.TaskAdapter import com.casic.br.ktd.base.KotlinBaseFragment -import com.casic.br.ktd.holder.SwipeViewHolder import com.casic.br.ktd.model.TaskListModel import com.casic.br.ktd.view.InspectionActivity import com.casic.br.ktd.vm.TaskViewModel import com.casic.br.ktd.widgets.AlertControlDialog import com.casic.br.ktd.widgets.AlertInputDialog import com.casic.br.ktd.widgets.DateRangeActionSheet -import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -26,9 +24,10 @@ class TaskPageFragment : KotlinBaseFragment(), Handler.Callback { + private val kTag = "TaskPageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var taskViewModel: TaskViewModel - private lateinit var taskAdapter: TaskAdapter + private lateinit var taskAdapter: TaskAdapter private var dataBeans: MutableList = ArrayList() private var selectedItems: MutableList = ArrayList() private var pageIndex = 1 @@ -80,58 +79,12 @@ bv.emptyLayout.visibility = View.VISIBLE } else { bv.emptyLayout.visibility = View.GONE - taskAdapter = object : TaskAdapter( - requireContext(), R.layout.item_task_rv_l, dataBeans - ) { - override fun convertView( - viewHolder: SwipeViewHolder, position: Int, - item: TaskListModel.DataModel.RowsModel - ) { - val beginDate = if (item.beginDate.isNullOrBlank()) { - "时间未知" - } else { - item.beginDate - } - - val endDate = if (item.endDate.isNullOrBlank()) { - "时间未知" - } else { - item.endDate - } - - val km = if (item.km.isNullOrBlank()) { - "0" - } else { - item.km - } - - val taskState: String - if (item.status == "0") { - taskState = "进行中" - viewHolder.setBackgroundColor( - R.id.taskStateView, R.color.green.convertColor(requireContext()) - ) - } else { - taskState = "已完成" - viewHolder.setBackgroundColor( - R.id.taskStateView, - R.color.themeColor.convertColor(requireContext()) - ) - } - - viewHolder.setText(R.id.taskCodeView, item.taskCode) - .setText(R.id.taskNameView, item.taskName) - .setText(R.id.startTimeView, beginDate) - .setText(R.id.endTimeView, endDate) - .setText(R.id.pathLengthView, km) - .setText(R.id.taskStateView, taskState) - } - } + taskAdapter = TaskAdapter(requireContext(), dataBeans) //绑定侧滑事件 swipeAction.attachToRecyclerView(bv.taskRecyclerView) bv.taskRecyclerView.adapter = taskAdapter taskAdapter.setOnItemCheckedListener(object : - TaskAdapter.OnItemCheckedListener { + TaskAdapter.OnItemCheckedListener { override fun onItemChecked(items: ArrayList) { selectedItems = items } @@ -205,6 +158,8 @@ override fun onDateRangeSelected(startDate: String, endDate: String) { startTime = startDate endTime = endDate + //条件查询 + getTasksByPage() //显示 bv.selectedDateView.text = "$startDate ~ $endDate" @@ -212,6 +167,18 @@ }).build().show() } + bv.resetParamView.setOnClickListener { + bv.selectedDateView.text = "" + bv.taskNameView.setText("") + bv.taskCodeView.setText("") + + startTime = "" + endTime = "" + + //显示所有 + getTasksByPage() + } + bv.addTaskButton.setOnClickListener { AlertInputDialog.Builder() .setContext(requireContext()) diff --git a/app/src/main/java/com/casic/br/ktd/adapter/TaskAdapter.kt b/app/src/main/java/com/casic/br/ktd/adapter/TaskAdapter.kt index 17ebf9c..b9186e6 100644 --- a/app/src/main/java/com/casic/br/ktd/adapter/TaskAdapter.kt +++ b/app/src/main/java/com/casic/br/ktd/adapter/TaskAdapter.kt @@ -6,23 +6,26 @@ import android.view.LayoutInflater import android.view.ViewGroup import android.widget.CheckBox -import androidx.annotation.LayoutRes import androidx.recyclerview.widget.RecyclerView import com.casic.br.ktd.R import com.casic.br.ktd.holder.SwipeViewHolder +import com.casic.br.ktd.model.TaskListModel +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.convertDrawable import com.pengxh.kt.lite.extensions.dp2px import com.qmuiteam.qmui.recyclerView.QMUISwipeAction -abstract class TaskAdapter( - ctx: Context, @LayoutRes private val xmlResource: Int, private val dataRows: MutableList -) : RecyclerView.Adapter() { +class TaskAdapter( + private val ctx: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { private val kTag = "TaskAdapter" + private val TYPE_TOP_TITLE = 0 + private val TYPE_ITEM_DATA = 1 private var inflater: LayoutInflater = LayoutInflater.from(ctx) private var multipleSelected = mutableSetOf() - private var selectedItems = ArrayList() + private var selectedItems = ArrayList() private var deleteAction = QMUISwipeAction.ActionBuilder() .icon(R.mipmap.delete_task.convertDrawable(ctx)) @@ -40,58 +43,119 @@ .backgroundColor(R.color.themeColor.convertColor(ctx)) .build() - override fun getItemCount(): Int = dataRows.size + //标题行,需要+1 + override fun getItemCount(): Int = dataRows.size + 1 - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SwipeViewHolder { - val view = inflater.inflate(xmlResource, parent, false) - val swipeViewHolder = SwipeViewHolder(view) - swipeViewHolder.addSwipeAction(deleteAction) - swipeViewHolder.addSwipeAction(handleAction) - return swipeViewHolder + override fun getItemViewType(position: Int): Int { + return if (position == 0) { + TYPE_TOP_TITLE + } else { + TYPE_ITEM_DATA + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + if (viewType == TYPE_TOP_TITLE) { + return ViewHolder(inflater.inflate(R.layout.item_task_rv_l_title, parent, false)) + } else { + val view = inflater.inflate(R.layout.item_task_rv_l, parent, false) + val swipeViewHolder = SwipeViewHolder(view) + swipeViewHolder.addSwipeAction(deleteAction) + swipeViewHolder.addSwipeAction(handleAction) + return swipeViewHolder + } } @SuppressLint("NotifyDataSetChanged") - fun setRefreshData(dataRows: MutableList) { + fun setRefreshData(dataRows: MutableList) { this.dataRows.clear() this.dataRows.addAll(dataRows) notifyDataSetChanged() } - fun setLoadMoreData(dataRows: MutableList) { + fun setLoadMoreData(dataRows: MutableList) { this.dataRows.addAll(dataRows) notifyItemRangeInserted(this.dataRows.size, dataRows.size) } - override fun onBindViewHolder(holder: SwipeViewHolder, position: Int) { - val multiSelectCheckBox: CheckBox = holder.itemView.findViewById(R.id.multiSelectCheckBox) - - multiSelectCheckBox.isSelected = multipleSelected.contains(position) - multiSelectCheckBox.setOnClickListener { - if (multipleSelected.contains(position)) { - multipleSelected.remove(position) - selectedItems.remove(dataRows[position]) - holder.itemView.isSelected = false + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder is SwipeViewHolder) { + //绑定数据。标题已经把position=0占用,但是size+1,所以需要数据绑定实际position-1 + val item = dataRows[position - 1] + val beginDate = if (item.beginDate.isNullOrBlank()) { + "时间未知" } else { - multipleSelected.add(position) - selectedItems.add(dataRows[position]) - holder.itemView.isSelected = true + item.beginDate } - itemCheckedListener?.onItemChecked(selectedItems) + val endDate = if (item.endDate.isNullOrBlank()) { + "时间未知" + } else { + item.endDate + } + + val km = if (item.km.isNullOrBlank()) { + "0" + } else { + item.km + } + + val taskState: String + if (item.status == "0") { + taskState = "进行中" + holder.setBackgroundColor(R.id.taskStateView, R.color.green.convertColor(ctx)) + } else { + taskState = "已完成" + holder.setBackgroundColor(R.id.taskStateView, R.color.themeColor.convertColor(ctx)) + } + + holder.setText(R.id.taskCodeView, item.taskCode) + .setText(R.id.taskNameView, item.taskName) + .setText(R.id.startTimeView, beginDate) + .setText(R.id.endTimeView, endDate) + .setText(R.id.pathLengthView, km) + .setText(R.id.taskStateView, taskState) + + //item背景色 + if (position % 2 == 0) { + holder.setBackgroundColor(R.id.rootView, Color.parseColor("#EEF1F6")) + } + + //多选 + val multiSelectCheckBox: CheckBox = + holder.itemView.findViewById(R.id.multiSelectCheckBox) + + multiSelectCheckBox.isSelected = multipleSelected.contains(position) + multiSelectCheckBox.setOnClickListener { + if (multipleSelected.contains(position)) { + multipleSelected.remove(position) + selectedItems.remove(dataRows[position]) + holder.itemView.isSelected = false + } else { + multipleSelected.add(position) + selectedItems.add(dataRows[position]) + holder.itemView.isSelected = true + } + + itemCheckedListener?.onItemChecked(selectedItems) + } + } else { + (holder as ViewHolder).setText(R.id.taskCodeView, "任务编号") + .setText(R.id.taskNameView, "巡检任务名称") + .setText(R.id.startTimeView, "开始时间") + .setText(R.id.endTimeView, "结束时间") + .setText(R.id.pathLengthView, "巡检公里") + .setText(R.id.taskStateView, "巡检状态") } - - convertView(holder, position, dataRows[position]) } - abstract fun convertView(viewHolder: SwipeViewHolder, position: Int, item: T) + private var itemCheckedListener: OnItemCheckedListener? = null - private var itemCheckedListener: OnItemCheckedListener? = null - - interface OnItemCheckedListener { - fun onItemChecked(items: ArrayList) + interface OnItemCheckedListener { + fun onItemChecked(items: ArrayList) } - fun setOnItemCheckedListener(listener: OnItemCheckedListener?) { + fun setOnItemCheckedListener(listener: OnItemCheckedListener) { itemCheckedListener = listener } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt index 343991d..4fe2b98 100644 --- a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt +++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt @@ -9,14 +9,12 @@ import com.casic.br.ktd.R import com.casic.br.ktd.adapter.TaskAdapter import com.casic.br.ktd.base.KotlinBaseFragment -import com.casic.br.ktd.holder.SwipeViewHolder import com.casic.br.ktd.model.TaskListModel import com.casic.br.ktd.view.InspectionActivity import com.casic.br.ktd.vm.TaskViewModel import com.casic.br.ktd.widgets.AlertControlDialog import com.casic.br.ktd.widgets.AlertInputDialog import com.casic.br.ktd.widgets.DateRangeActionSheet -import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -26,9 +24,10 @@ class TaskPageFragment : KotlinBaseFragment(), Handler.Callback { + private val kTag = "TaskPageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var taskViewModel: TaskViewModel - private lateinit var taskAdapter: TaskAdapter + private lateinit var taskAdapter: TaskAdapter private var dataBeans: MutableList = ArrayList() private var selectedItems: MutableList = ArrayList() private var pageIndex = 1 @@ -80,58 +79,12 @@ bv.emptyLayout.visibility = View.VISIBLE } else { bv.emptyLayout.visibility = View.GONE - taskAdapter = object : TaskAdapter( - requireContext(), R.layout.item_task_rv_l, dataBeans - ) { - override fun convertView( - viewHolder: SwipeViewHolder, position: Int, - item: TaskListModel.DataModel.RowsModel - ) { - val beginDate = if (item.beginDate.isNullOrBlank()) { - "时间未知" - } else { - item.beginDate - } - - val endDate = if (item.endDate.isNullOrBlank()) { - "时间未知" - } else { - item.endDate - } - - val km = if (item.km.isNullOrBlank()) { - "0" - } else { - item.km - } - - val taskState: String - if (item.status == "0") { - taskState = "进行中" - viewHolder.setBackgroundColor( - R.id.taskStateView, R.color.green.convertColor(requireContext()) - ) - } else { - taskState = "已完成" - viewHolder.setBackgroundColor( - R.id.taskStateView, - R.color.themeColor.convertColor(requireContext()) - ) - } - - viewHolder.setText(R.id.taskCodeView, item.taskCode) - .setText(R.id.taskNameView, item.taskName) - .setText(R.id.startTimeView, beginDate) - .setText(R.id.endTimeView, endDate) - .setText(R.id.pathLengthView, km) - .setText(R.id.taskStateView, taskState) - } - } + taskAdapter = TaskAdapter(requireContext(), dataBeans) //绑定侧滑事件 swipeAction.attachToRecyclerView(bv.taskRecyclerView) bv.taskRecyclerView.adapter = taskAdapter taskAdapter.setOnItemCheckedListener(object : - TaskAdapter.OnItemCheckedListener { + TaskAdapter.OnItemCheckedListener { override fun onItemChecked(items: ArrayList) { selectedItems = items } @@ -205,6 +158,8 @@ override fun onDateRangeSelected(startDate: String, endDate: String) { startTime = startDate endTime = endDate + //条件查询 + getTasksByPage() //显示 bv.selectedDateView.text = "$startDate ~ $endDate" @@ -212,6 +167,18 @@ }).build().show() } + bv.resetParamView.setOnClickListener { + bv.selectedDateView.text = "" + bv.taskNameView.setText("") + bv.taskCodeView.setText("") + + startTime = "" + endTime = "" + + //显示所有 + getTasksByPage() + } + bv.addTaskButton.setOnClickListener { AlertInputDialog.Builder() .setContext(requireContext()) diff --git a/app/src/main/java/com/casic/br/ktd/holder/SwipeViewHolder.kt b/app/src/main/java/com/casic/br/ktd/holder/SwipeViewHolder.kt index b7676e4..08c8656 100644 --- a/app/src/main/java/com/casic/br/ktd/holder/SwipeViewHolder.kt +++ b/app/src/main/java/com/casic/br/ktd/holder/SwipeViewHolder.kt @@ -49,6 +49,23 @@ } /** + * 提供TextView和Button设置文本颜色简化操作 + * + * @param idRes 控件ID + * @param color 颜色 + * @return holder + */ + fun setTextColor(@IdRes idRes: Int, color: Int): SwipeViewHolder { + val view = getView(idRes) + if (view is TextView) { + view.setTextColor(color) + } else if (view is Button) { + view.setTextColor(color) + } + return this + } + + /** * 设置指定ViewId的背景颜色 * * @param idRes 控件ID diff --git a/app/src/main/java/com/casic/br/ktd/adapter/TaskAdapter.kt b/app/src/main/java/com/casic/br/ktd/adapter/TaskAdapter.kt index 17ebf9c..b9186e6 100644 --- a/app/src/main/java/com/casic/br/ktd/adapter/TaskAdapter.kt +++ b/app/src/main/java/com/casic/br/ktd/adapter/TaskAdapter.kt @@ -6,23 +6,26 @@ import android.view.LayoutInflater import android.view.ViewGroup import android.widget.CheckBox -import androidx.annotation.LayoutRes import androidx.recyclerview.widget.RecyclerView import com.casic.br.ktd.R import com.casic.br.ktd.holder.SwipeViewHolder +import com.casic.br.ktd.model.TaskListModel +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.convertDrawable import com.pengxh.kt.lite.extensions.dp2px import com.qmuiteam.qmui.recyclerView.QMUISwipeAction -abstract class TaskAdapter( - ctx: Context, @LayoutRes private val xmlResource: Int, private val dataRows: MutableList -) : RecyclerView.Adapter() { +class TaskAdapter( + private val ctx: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { private val kTag = "TaskAdapter" + private val TYPE_TOP_TITLE = 0 + private val TYPE_ITEM_DATA = 1 private var inflater: LayoutInflater = LayoutInflater.from(ctx) private var multipleSelected = mutableSetOf() - private var selectedItems = ArrayList() + private var selectedItems = ArrayList() private var deleteAction = QMUISwipeAction.ActionBuilder() .icon(R.mipmap.delete_task.convertDrawable(ctx)) @@ -40,58 +43,119 @@ .backgroundColor(R.color.themeColor.convertColor(ctx)) .build() - override fun getItemCount(): Int = dataRows.size + //标题行,需要+1 + override fun getItemCount(): Int = dataRows.size + 1 - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SwipeViewHolder { - val view = inflater.inflate(xmlResource, parent, false) - val swipeViewHolder = SwipeViewHolder(view) - swipeViewHolder.addSwipeAction(deleteAction) - swipeViewHolder.addSwipeAction(handleAction) - return swipeViewHolder + override fun getItemViewType(position: Int): Int { + return if (position == 0) { + TYPE_TOP_TITLE + } else { + TYPE_ITEM_DATA + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + if (viewType == TYPE_TOP_TITLE) { + return ViewHolder(inflater.inflate(R.layout.item_task_rv_l_title, parent, false)) + } else { + val view = inflater.inflate(R.layout.item_task_rv_l, parent, false) + val swipeViewHolder = SwipeViewHolder(view) + swipeViewHolder.addSwipeAction(deleteAction) + swipeViewHolder.addSwipeAction(handleAction) + return swipeViewHolder + } } @SuppressLint("NotifyDataSetChanged") - fun setRefreshData(dataRows: MutableList) { + fun setRefreshData(dataRows: MutableList) { this.dataRows.clear() this.dataRows.addAll(dataRows) notifyDataSetChanged() } - fun setLoadMoreData(dataRows: MutableList) { + fun setLoadMoreData(dataRows: MutableList) { this.dataRows.addAll(dataRows) notifyItemRangeInserted(this.dataRows.size, dataRows.size) } - override fun onBindViewHolder(holder: SwipeViewHolder, position: Int) { - val multiSelectCheckBox: CheckBox = holder.itemView.findViewById(R.id.multiSelectCheckBox) - - multiSelectCheckBox.isSelected = multipleSelected.contains(position) - multiSelectCheckBox.setOnClickListener { - if (multipleSelected.contains(position)) { - multipleSelected.remove(position) - selectedItems.remove(dataRows[position]) - holder.itemView.isSelected = false + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder is SwipeViewHolder) { + //绑定数据。标题已经把position=0占用,但是size+1,所以需要数据绑定实际position-1 + val item = dataRows[position - 1] + val beginDate = if (item.beginDate.isNullOrBlank()) { + "时间未知" } else { - multipleSelected.add(position) - selectedItems.add(dataRows[position]) - holder.itemView.isSelected = true + item.beginDate } - itemCheckedListener?.onItemChecked(selectedItems) + val endDate = if (item.endDate.isNullOrBlank()) { + "时间未知" + } else { + item.endDate + } + + val km = if (item.km.isNullOrBlank()) { + "0" + } else { + item.km + } + + val taskState: String + if (item.status == "0") { + taskState = "进行中" + holder.setBackgroundColor(R.id.taskStateView, R.color.green.convertColor(ctx)) + } else { + taskState = "已完成" + holder.setBackgroundColor(R.id.taskStateView, R.color.themeColor.convertColor(ctx)) + } + + holder.setText(R.id.taskCodeView, item.taskCode) + .setText(R.id.taskNameView, item.taskName) + .setText(R.id.startTimeView, beginDate) + .setText(R.id.endTimeView, endDate) + .setText(R.id.pathLengthView, km) + .setText(R.id.taskStateView, taskState) + + //item背景色 + if (position % 2 == 0) { + holder.setBackgroundColor(R.id.rootView, Color.parseColor("#EEF1F6")) + } + + //多选 + val multiSelectCheckBox: CheckBox = + holder.itemView.findViewById(R.id.multiSelectCheckBox) + + multiSelectCheckBox.isSelected = multipleSelected.contains(position) + multiSelectCheckBox.setOnClickListener { + if (multipleSelected.contains(position)) { + multipleSelected.remove(position) + selectedItems.remove(dataRows[position]) + holder.itemView.isSelected = false + } else { + multipleSelected.add(position) + selectedItems.add(dataRows[position]) + holder.itemView.isSelected = true + } + + itemCheckedListener?.onItemChecked(selectedItems) + } + } else { + (holder as ViewHolder).setText(R.id.taskCodeView, "任务编号") + .setText(R.id.taskNameView, "巡检任务名称") + .setText(R.id.startTimeView, "开始时间") + .setText(R.id.endTimeView, "结束时间") + .setText(R.id.pathLengthView, "巡检公里") + .setText(R.id.taskStateView, "巡检状态") } - - convertView(holder, position, dataRows[position]) } - abstract fun convertView(viewHolder: SwipeViewHolder, position: Int, item: T) + private var itemCheckedListener: OnItemCheckedListener? = null - private var itemCheckedListener: OnItemCheckedListener? = null - - interface OnItemCheckedListener { - fun onItemChecked(items: ArrayList) + interface OnItemCheckedListener { + fun onItemChecked(items: ArrayList) } - fun setOnItemCheckedListener(listener: OnItemCheckedListener?) { + fun setOnItemCheckedListener(listener: OnItemCheckedListener) { itemCheckedListener = listener } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt index 343991d..4fe2b98 100644 --- a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt +++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt @@ -9,14 +9,12 @@ import com.casic.br.ktd.R import com.casic.br.ktd.adapter.TaskAdapter import com.casic.br.ktd.base.KotlinBaseFragment -import com.casic.br.ktd.holder.SwipeViewHolder import com.casic.br.ktd.model.TaskListModel import com.casic.br.ktd.view.InspectionActivity import com.casic.br.ktd.vm.TaskViewModel import com.casic.br.ktd.widgets.AlertControlDialog import com.casic.br.ktd.widgets.AlertInputDialog import com.casic.br.ktd.widgets.DateRangeActionSheet -import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -26,9 +24,10 @@ class TaskPageFragment : KotlinBaseFragment(), Handler.Callback { + private val kTag = "TaskPageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var taskViewModel: TaskViewModel - private lateinit var taskAdapter: TaskAdapter + private lateinit var taskAdapter: TaskAdapter private var dataBeans: MutableList = ArrayList() private var selectedItems: MutableList = ArrayList() private var pageIndex = 1 @@ -80,58 +79,12 @@ bv.emptyLayout.visibility = View.VISIBLE } else { bv.emptyLayout.visibility = View.GONE - taskAdapter = object : TaskAdapter( - requireContext(), R.layout.item_task_rv_l, dataBeans - ) { - override fun convertView( - viewHolder: SwipeViewHolder, position: Int, - item: TaskListModel.DataModel.RowsModel - ) { - val beginDate = if (item.beginDate.isNullOrBlank()) { - "时间未知" - } else { - item.beginDate - } - - val endDate = if (item.endDate.isNullOrBlank()) { - "时间未知" - } else { - item.endDate - } - - val km = if (item.km.isNullOrBlank()) { - "0" - } else { - item.km - } - - val taskState: String - if (item.status == "0") { - taskState = "进行中" - viewHolder.setBackgroundColor( - R.id.taskStateView, R.color.green.convertColor(requireContext()) - ) - } else { - taskState = "已完成" - viewHolder.setBackgroundColor( - R.id.taskStateView, - R.color.themeColor.convertColor(requireContext()) - ) - } - - viewHolder.setText(R.id.taskCodeView, item.taskCode) - .setText(R.id.taskNameView, item.taskName) - .setText(R.id.startTimeView, beginDate) - .setText(R.id.endTimeView, endDate) - .setText(R.id.pathLengthView, km) - .setText(R.id.taskStateView, taskState) - } - } + taskAdapter = TaskAdapter(requireContext(), dataBeans) //绑定侧滑事件 swipeAction.attachToRecyclerView(bv.taskRecyclerView) bv.taskRecyclerView.adapter = taskAdapter taskAdapter.setOnItemCheckedListener(object : - TaskAdapter.OnItemCheckedListener { + TaskAdapter.OnItemCheckedListener { override fun onItemChecked(items: ArrayList) { selectedItems = items } @@ -205,6 +158,8 @@ override fun onDateRangeSelected(startDate: String, endDate: String) { startTime = startDate endTime = endDate + //条件查询 + getTasksByPage() //显示 bv.selectedDateView.text = "$startDate ~ $endDate" @@ -212,6 +167,18 @@ }).build().show() } + bv.resetParamView.setOnClickListener { + bv.selectedDateView.text = "" + bv.taskNameView.setText("") + bv.taskCodeView.setText("") + + startTime = "" + endTime = "" + + //显示所有 + getTasksByPage() + } + bv.addTaskButton.setOnClickListener { AlertInputDialog.Builder() .setContext(requireContext()) diff --git a/app/src/main/java/com/casic/br/ktd/holder/SwipeViewHolder.kt b/app/src/main/java/com/casic/br/ktd/holder/SwipeViewHolder.kt index b7676e4..08c8656 100644 --- a/app/src/main/java/com/casic/br/ktd/holder/SwipeViewHolder.kt +++ b/app/src/main/java/com/casic/br/ktd/holder/SwipeViewHolder.kt @@ -49,6 +49,23 @@ } /** + * 提供TextView和Button设置文本颜色简化操作 + * + * @param idRes 控件ID + * @param color 颜色 + * @return holder + */ + fun setTextColor(@IdRes idRes: Int, color: Int): SwipeViewHolder { + val view = getView(idRes) + if (view is TextView) { + view.setTextColor(color) + } else if (view is Button) { + view.setTextColor(color) + } + return this + } + + /** * 设置指定ViewId的背景颜色 * * @param idRes 控件ID diff --git a/app/src/main/res/layout/fragment_task.xml b/app/src/main/res/layout/fragment_task.xml index 424f407..8ce604f 100644 --- a/app/src/main/res/layout/fragment_task.xml +++ b/app/src/main/res/layout/fragment_task.xml @@ -81,6 +81,17 @@ android:hint="请输入巡检任务编号" /> + + - + + + android:layout_height="match_parent"> - - - - - - - - - - - - - - - - - - - - + android:layout_height="wrap_content" /> - + - - - - - + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ktd/adapter/TaskAdapter.kt b/app/src/main/java/com/casic/br/ktd/adapter/TaskAdapter.kt index 17ebf9c..b9186e6 100644 --- a/app/src/main/java/com/casic/br/ktd/adapter/TaskAdapter.kt +++ b/app/src/main/java/com/casic/br/ktd/adapter/TaskAdapter.kt @@ -6,23 +6,26 @@ import android.view.LayoutInflater import android.view.ViewGroup import android.widget.CheckBox -import androidx.annotation.LayoutRes import androidx.recyclerview.widget.RecyclerView import com.casic.br.ktd.R import com.casic.br.ktd.holder.SwipeViewHolder +import com.casic.br.ktd.model.TaskListModel +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.convertDrawable import com.pengxh.kt.lite.extensions.dp2px import com.qmuiteam.qmui.recyclerView.QMUISwipeAction -abstract class TaskAdapter( - ctx: Context, @LayoutRes private val xmlResource: Int, private val dataRows: MutableList -) : RecyclerView.Adapter() { +class TaskAdapter( + private val ctx: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { private val kTag = "TaskAdapter" + private val TYPE_TOP_TITLE = 0 + private val TYPE_ITEM_DATA = 1 private var inflater: LayoutInflater = LayoutInflater.from(ctx) private var multipleSelected = mutableSetOf() - private var selectedItems = ArrayList() + private var selectedItems = ArrayList() private var deleteAction = QMUISwipeAction.ActionBuilder() .icon(R.mipmap.delete_task.convertDrawable(ctx)) @@ -40,58 +43,119 @@ .backgroundColor(R.color.themeColor.convertColor(ctx)) .build() - override fun getItemCount(): Int = dataRows.size + //标题行,需要+1 + override fun getItemCount(): Int = dataRows.size + 1 - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SwipeViewHolder { - val view = inflater.inflate(xmlResource, parent, false) - val swipeViewHolder = SwipeViewHolder(view) - swipeViewHolder.addSwipeAction(deleteAction) - swipeViewHolder.addSwipeAction(handleAction) - return swipeViewHolder + override fun getItemViewType(position: Int): Int { + return if (position == 0) { + TYPE_TOP_TITLE + } else { + TYPE_ITEM_DATA + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + if (viewType == TYPE_TOP_TITLE) { + return ViewHolder(inflater.inflate(R.layout.item_task_rv_l_title, parent, false)) + } else { + val view = inflater.inflate(R.layout.item_task_rv_l, parent, false) + val swipeViewHolder = SwipeViewHolder(view) + swipeViewHolder.addSwipeAction(deleteAction) + swipeViewHolder.addSwipeAction(handleAction) + return swipeViewHolder + } } @SuppressLint("NotifyDataSetChanged") - fun setRefreshData(dataRows: MutableList) { + fun setRefreshData(dataRows: MutableList) { this.dataRows.clear() this.dataRows.addAll(dataRows) notifyDataSetChanged() } - fun setLoadMoreData(dataRows: MutableList) { + fun setLoadMoreData(dataRows: MutableList) { this.dataRows.addAll(dataRows) notifyItemRangeInserted(this.dataRows.size, dataRows.size) } - override fun onBindViewHolder(holder: SwipeViewHolder, position: Int) { - val multiSelectCheckBox: CheckBox = holder.itemView.findViewById(R.id.multiSelectCheckBox) - - multiSelectCheckBox.isSelected = multipleSelected.contains(position) - multiSelectCheckBox.setOnClickListener { - if (multipleSelected.contains(position)) { - multipleSelected.remove(position) - selectedItems.remove(dataRows[position]) - holder.itemView.isSelected = false + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder is SwipeViewHolder) { + //绑定数据。标题已经把position=0占用,但是size+1,所以需要数据绑定实际position-1 + val item = dataRows[position - 1] + val beginDate = if (item.beginDate.isNullOrBlank()) { + "时间未知" } else { - multipleSelected.add(position) - selectedItems.add(dataRows[position]) - holder.itemView.isSelected = true + item.beginDate } - itemCheckedListener?.onItemChecked(selectedItems) + val endDate = if (item.endDate.isNullOrBlank()) { + "时间未知" + } else { + item.endDate + } + + val km = if (item.km.isNullOrBlank()) { + "0" + } else { + item.km + } + + val taskState: String + if (item.status == "0") { + taskState = "进行中" + holder.setBackgroundColor(R.id.taskStateView, R.color.green.convertColor(ctx)) + } else { + taskState = "已完成" + holder.setBackgroundColor(R.id.taskStateView, R.color.themeColor.convertColor(ctx)) + } + + holder.setText(R.id.taskCodeView, item.taskCode) + .setText(R.id.taskNameView, item.taskName) + .setText(R.id.startTimeView, beginDate) + .setText(R.id.endTimeView, endDate) + .setText(R.id.pathLengthView, km) + .setText(R.id.taskStateView, taskState) + + //item背景色 + if (position % 2 == 0) { + holder.setBackgroundColor(R.id.rootView, Color.parseColor("#EEF1F6")) + } + + //多选 + val multiSelectCheckBox: CheckBox = + holder.itemView.findViewById(R.id.multiSelectCheckBox) + + multiSelectCheckBox.isSelected = multipleSelected.contains(position) + multiSelectCheckBox.setOnClickListener { + if (multipleSelected.contains(position)) { + multipleSelected.remove(position) + selectedItems.remove(dataRows[position]) + holder.itemView.isSelected = false + } else { + multipleSelected.add(position) + selectedItems.add(dataRows[position]) + holder.itemView.isSelected = true + } + + itemCheckedListener?.onItemChecked(selectedItems) + } + } else { + (holder as ViewHolder).setText(R.id.taskCodeView, "任务编号") + .setText(R.id.taskNameView, "巡检任务名称") + .setText(R.id.startTimeView, "开始时间") + .setText(R.id.endTimeView, "结束时间") + .setText(R.id.pathLengthView, "巡检公里") + .setText(R.id.taskStateView, "巡检状态") } - - convertView(holder, position, dataRows[position]) } - abstract fun convertView(viewHolder: SwipeViewHolder, position: Int, item: T) + private var itemCheckedListener: OnItemCheckedListener? = null - private var itemCheckedListener: OnItemCheckedListener? = null - - interface OnItemCheckedListener { - fun onItemChecked(items: ArrayList) + interface OnItemCheckedListener { + fun onItemChecked(items: ArrayList) } - fun setOnItemCheckedListener(listener: OnItemCheckedListener?) { + fun setOnItemCheckedListener(listener: OnItemCheckedListener) { itemCheckedListener = listener } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt index 343991d..4fe2b98 100644 --- a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt +++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt @@ -9,14 +9,12 @@ import com.casic.br.ktd.R import com.casic.br.ktd.adapter.TaskAdapter import com.casic.br.ktd.base.KotlinBaseFragment -import com.casic.br.ktd.holder.SwipeViewHolder import com.casic.br.ktd.model.TaskListModel import com.casic.br.ktd.view.InspectionActivity import com.casic.br.ktd.vm.TaskViewModel import com.casic.br.ktd.widgets.AlertControlDialog import com.casic.br.ktd.widgets.AlertInputDialog import com.casic.br.ktd.widgets.DateRangeActionSheet -import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -26,9 +24,10 @@ class TaskPageFragment : KotlinBaseFragment(), Handler.Callback { + private val kTag = "TaskPageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var taskViewModel: TaskViewModel - private lateinit var taskAdapter: TaskAdapter + private lateinit var taskAdapter: TaskAdapter private var dataBeans: MutableList = ArrayList() private var selectedItems: MutableList = ArrayList() private var pageIndex = 1 @@ -80,58 +79,12 @@ bv.emptyLayout.visibility = View.VISIBLE } else { bv.emptyLayout.visibility = View.GONE - taskAdapter = object : TaskAdapter( - requireContext(), R.layout.item_task_rv_l, dataBeans - ) { - override fun convertView( - viewHolder: SwipeViewHolder, position: Int, - item: TaskListModel.DataModel.RowsModel - ) { - val beginDate = if (item.beginDate.isNullOrBlank()) { - "时间未知" - } else { - item.beginDate - } - - val endDate = if (item.endDate.isNullOrBlank()) { - "时间未知" - } else { - item.endDate - } - - val km = if (item.km.isNullOrBlank()) { - "0" - } else { - item.km - } - - val taskState: String - if (item.status == "0") { - taskState = "进行中" - viewHolder.setBackgroundColor( - R.id.taskStateView, R.color.green.convertColor(requireContext()) - ) - } else { - taskState = "已完成" - viewHolder.setBackgroundColor( - R.id.taskStateView, - R.color.themeColor.convertColor(requireContext()) - ) - } - - viewHolder.setText(R.id.taskCodeView, item.taskCode) - .setText(R.id.taskNameView, item.taskName) - .setText(R.id.startTimeView, beginDate) - .setText(R.id.endTimeView, endDate) - .setText(R.id.pathLengthView, km) - .setText(R.id.taskStateView, taskState) - } - } + taskAdapter = TaskAdapter(requireContext(), dataBeans) //绑定侧滑事件 swipeAction.attachToRecyclerView(bv.taskRecyclerView) bv.taskRecyclerView.adapter = taskAdapter taskAdapter.setOnItemCheckedListener(object : - TaskAdapter.OnItemCheckedListener { + TaskAdapter.OnItemCheckedListener { override fun onItemChecked(items: ArrayList) { selectedItems = items } @@ -205,6 +158,8 @@ override fun onDateRangeSelected(startDate: String, endDate: String) { startTime = startDate endTime = endDate + //条件查询 + getTasksByPage() //显示 bv.selectedDateView.text = "$startDate ~ $endDate" @@ -212,6 +167,18 @@ }).build().show() } + bv.resetParamView.setOnClickListener { + bv.selectedDateView.text = "" + bv.taskNameView.setText("") + bv.taskCodeView.setText("") + + startTime = "" + endTime = "" + + //显示所有 + getTasksByPage() + } + bv.addTaskButton.setOnClickListener { AlertInputDialog.Builder() .setContext(requireContext()) diff --git a/app/src/main/java/com/casic/br/ktd/holder/SwipeViewHolder.kt b/app/src/main/java/com/casic/br/ktd/holder/SwipeViewHolder.kt index b7676e4..08c8656 100644 --- a/app/src/main/java/com/casic/br/ktd/holder/SwipeViewHolder.kt +++ b/app/src/main/java/com/casic/br/ktd/holder/SwipeViewHolder.kt @@ -49,6 +49,23 @@ } /** + * 提供TextView和Button设置文本颜色简化操作 + * + * @param idRes 控件ID + * @param color 颜色 + * @return holder + */ + fun setTextColor(@IdRes idRes: Int, color: Int): SwipeViewHolder { + val view = getView(idRes) + if (view is TextView) { + view.setTextColor(color) + } else if (view is Button) { + view.setTextColor(color) + } + return this + } + + /** * 设置指定ViewId的背景颜色 * * @param idRes 控件ID diff --git a/app/src/main/res/layout/fragment_task.xml b/app/src/main/res/layout/fragment_task.xml index 424f407..8ce604f 100644 --- a/app/src/main/res/layout/fragment_task.xml +++ b/app/src/main/res/layout/fragment_task.xml @@ -81,6 +81,17 @@ android:hint="请输入巡检任务编号" /> + + - + + + android:layout_height="match_parent"> - - - - - - - - - - - - - - - - - - - - + android:layout_height="wrap_content" /> - + - - - - - + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_task_rv_l.xml b/app/src/main/res/layout/item_task_rv_l.xml index e06ba5a..346fc84 100644 --- a/app/src/main/res/layout/item_task_rv_l.xml +++ b/app/src/main/res/layout/item_task_rv_l.xml @@ -1,6 +1,7 @@ + android:text="202304120001" + android:textSize="@dimen/sp_16" /> + android:text="永定路日常巡检任务" + android:textSize="@dimen/sp_16" /> + android:text="2023-07-05 09:40:10" + android:textSize="@dimen/sp_16" /> + android:text="2023-07-05 11:40:10" + android:textSize="@dimen/sp_16" /> + android:text="10" + android:textSize="@dimen/sp_16" /> diff --git a/app/src/main/java/com/casic/br/ktd/adapter/TaskAdapter.kt b/app/src/main/java/com/casic/br/ktd/adapter/TaskAdapter.kt index 17ebf9c..b9186e6 100644 --- a/app/src/main/java/com/casic/br/ktd/adapter/TaskAdapter.kt +++ b/app/src/main/java/com/casic/br/ktd/adapter/TaskAdapter.kt @@ -6,23 +6,26 @@ import android.view.LayoutInflater import android.view.ViewGroup import android.widget.CheckBox -import androidx.annotation.LayoutRes import androidx.recyclerview.widget.RecyclerView import com.casic.br.ktd.R import com.casic.br.ktd.holder.SwipeViewHolder +import com.casic.br.ktd.model.TaskListModel +import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.convertDrawable import com.pengxh.kt.lite.extensions.dp2px import com.qmuiteam.qmui.recyclerView.QMUISwipeAction -abstract class TaskAdapter( - ctx: Context, @LayoutRes private val xmlResource: Int, private val dataRows: MutableList -) : RecyclerView.Adapter() { +class TaskAdapter( + private val ctx: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { private val kTag = "TaskAdapter" + private val TYPE_TOP_TITLE = 0 + private val TYPE_ITEM_DATA = 1 private var inflater: LayoutInflater = LayoutInflater.from(ctx) private var multipleSelected = mutableSetOf() - private var selectedItems = ArrayList() + private var selectedItems = ArrayList() private var deleteAction = QMUISwipeAction.ActionBuilder() .icon(R.mipmap.delete_task.convertDrawable(ctx)) @@ -40,58 +43,119 @@ .backgroundColor(R.color.themeColor.convertColor(ctx)) .build() - override fun getItemCount(): Int = dataRows.size + //标题行,需要+1 + override fun getItemCount(): Int = dataRows.size + 1 - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SwipeViewHolder { - val view = inflater.inflate(xmlResource, parent, false) - val swipeViewHolder = SwipeViewHolder(view) - swipeViewHolder.addSwipeAction(deleteAction) - swipeViewHolder.addSwipeAction(handleAction) - return swipeViewHolder + override fun getItemViewType(position: Int): Int { + return if (position == 0) { + TYPE_TOP_TITLE + } else { + TYPE_ITEM_DATA + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + if (viewType == TYPE_TOP_TITLE) { + return ViewHolder(inflater.inflate(R.layout.item_task_rv_l_title, parent, false)) + } else { + val view = inflater.inflate(R.layout.item_task_rv_l, parent, false) + val swipeViewHolder = SwipeViewHolder(view) + swipeViewHolder.addSwipeAction(deleteAction) + swipeViewHolder.addSwipeAction(handleAction) + return swipeViewHolder + } } @SuppressLint("NotifyDataSetChanged") - fun setRefreshData(dataRows: MutableList) { + fun setRefreshData(dataRows: MutableList) { this.dataRows.clear() this.dataRows.addAll(dataRows) notifyDataSetChanged() } - fun setLoadMoreData(dataRows: MutableList) { + fun setLoadMoreData(dataRows: MutableList) { this.dataRows.addAll(dataRows) notifyItemRangeInserted(this.dataRows.size, dataRows.size) } - override fun onBindViewHolder(holder: SwipeViewHolder, position: Int) { - val multiSelectCheckBox: CheckBox = holder.itemView.findViewById(R.id.multiSelectCheckBox) - - multiSelectCheckBox.isSelected = multipleSelected.contains(position) - multiSelectCheckBox.setOnClickListener { - if (multipleSelected.contains(position)) { - multipleSelected.remove(position) - selectedItems.remove(dataRows[position]) - holder.itemView.isSelected = false + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder is SwipeViewHolder) { + //绑定数据。标题已经把position=0占用,但是size+1,所以需要数据绑定实际position-1 + val item = dataRows[position - 1] + val beginDate = if (item.beginDate.isNullOrBlank()) { + "时间未知" } else { - multipleSelected.add(position) - selectedItems.add(dataRows[position]) - holder.itemView.isSelected = true + item.beginDate } - itemCheckedListener?.onItemChecked(selectedItems) + val endDate = if (item.endDate.isNullOrBlank()) { + "时间未知" + } else { + item.endDate + } + + val km = if (item.km.isNullOrBlank()) { + "0" + } else { + item.km + } + + val taskState: String + if (item.status == "0") { + taskState = "进行中" + holder.setBackgroundColor(R.id.taskStateView, R.color.green.convertColor(ctx)) + } else { + taskState = "已完成" + holder.setBackgroundColor(R.id.taskStateView, R.color.themeColor.convertColor(ctx)) + } + + holder.setText(R.id.taskCodeView, item.taskCode) + .setText(R.id.taskNameView, item.taskName) + .setText(R.id.startTimeView, beginDate) + .setText(R.id.endTimeView, endDate) + .setText(R.id.pathLengthView, km) + .setText(R.id.taskStateView, taskState) + + //item背景色 + if (position % 2 == 0) { + holder.setBackgroundColor(R.id.rootView, Color.parseColor("#EEF1F6")) + } + + //多选 + val multiSelectCheckBox: CheckBox = + holder.itemView.findViewById(R.id.multiSelectCheckBox) + + multiSelectCheckBox.isSelected = multipleSelected.contains(position) + multiSelectCheckBox.setOnClickListener { + if (multipleSelected.contains(position)) { + multipleSelected.remove(position) + selectedItems.remove(dataRows[position]) + holder.itemView.isSelected = false + } else { + multipleSelected.add(position) + selectedItems.add(dataRows[position]) + holder.itemView.isSelected = true + } + + itemCheckedListener?.onItemChecked(selectedItems) + } + } else { + (holder as ViewHolder).setText(R.id.taskCodeView, "任务编号") + .setText(R.id.taskNameView, "巡检任务名称") + .setText(R.id.startTimeView, "开始时间") + .setText(R.id.endTimeView, "结束时间") + .setText(R.id.pathLengthView, "巡检公里") + .setText(R.id.taskStateView, "巡检状态") } - - convertView(holder, position, dataRows[position]) } - abstract fun convertView(viewHolder: SwipeViewHolder, position: Int, item: T) + private var itemCheckedListener: OnItemCheckedListener? = null - private var itemCheckedListener: OnItemCheckedListener? = null - - interface OnItemCheckedListener { - fun onItemChecked(items: ArrayList) + interface OnItemCheckedListener { + fun onItemChecked(items: ArrayList) } - fun setOnItemCheckedListener(listener: OnItemCheckedListener?) { + fun setOnItemCheckedListener(listener: OnItemCheckedListener) { itemCheckedListener = listener } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt index 343991d..4fe2b98 100644 --- a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt +++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt @@ -9,14 +9,12 @@ import com.casic.br.ktd.R import com.casic.br.ktd.adapter.TaskAdapter import com.casic.br.ktd.base.KotlinBaseFragment -import com.casic.br.ktd.holder.SwipeViewHolder import com.casic.br.ktd.model.TaskListModel import com.casic.br.ktd.view.InspectionActivity import com.casic.br.ktd.vm.TaskViewModel import com.casic.br.ktd.widgets.AlertControlDialog import com.casic.br.ktd.widgets.AlertInputDialog import com.casic.br.ktd.widgets.DateRangeActionSheet -import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -26,9 +24,10 @@ class TaskPageFragment : KotlinBaseFragment(), Handler.Callback { + private val kTag = "TaskPageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var taskViewModel: TaskViewModel - private lateinit var taskAdapter: TaskAdapter + private lateinit var taskAdapter: TaskAdapter private var dataBeans: MutableList = ArrayList() private var selectedItems: MutableList = ArrayList() private var pageIndex = 1 @@ -80,58 +79,12 @@ bv.emptyLayout.visibility = View.VISIBLE } else { bv.emptyLayout.visibility = View.GONE - taskAdapter = object : TaskAdapter( - requireContext(), R.layout.item_task_rv_l, dataBeans - ) { - override fun convertView( - viewHolder: SwipeViewHolder, position: Int, - item: TaskListModel.DataModel.RowsModel - ) { - val beginDate = if (item.beginDate.isNullOrBlank()) { - "时间未知" - } else { - item.beginDate - } - - val endDate = if (item.endDate.isNullOrBlank()) { - "时间未知" - } else { - item.endDate - } - - val km = if (item.km.isNullOrBlank()) { - "0" - } else { - item.km - } - - val taskState: String - if (item.status == "0") { - taskState = "进行中" - viewHolder.setBackgroundColor( - R.id.taskStateView, R.color.green.convertColor(requireContext()) - ) - } else { - taskState = "已完成" - viewHolder.setBackgroundColor( - R.id.taskStateView, - R.color.themeColor.convertColor(requireContext()) - ) - } - - viewHolder.setText(R.id.taskCodeView, item.taskCode) - .setText(R.id.taskNameView, item.taskName) - .setText(R.id.startTimeView, beginDate) - .setText(R.id.endTimeView, endDate) - .setText(R.id.pathLengthView, km) - .setText(R.id.taskStateView, taskState) - } - } + taskAdapter = TaskAdapter(requireContext(), dataBeans) //绑定侧滑事件 swipeAction.attachToRecyclerView(bv.taskRecyclerView) bv.taskRecyclerView.adapter = taskAdapter taskAdapter.setOnItemCheckedListener(object : - TaskAdapter.OnItemCheckedListener { + TaskAdapter.OnItemCheckedListener { override fun onItemChecked(items: ArrayList) { selectedItems = items } @@ -205,6 +158,8 @@ override fun onDateRangeSelected(startDate: String, endDate: String) { startTime = startDate endTime = endDate + //条件查询 + getTasksByPage() //显示 bv.selectedDateView.text = "$startDate ~ $endDate" @@ -212,6 +167,18 @@ }).build().show() } + bv.resetParamView.setOnClickListener { + bv.selectedDateView.text = "" + bv.taskNameView.setText("") + bv.taskCodeView.setText("") + + startTime = "" + endTime = "" + + //显示所有 + getTasksByPage() + } + bv.addTaskButton.setOnClickListener { AlertInputDialog.Builder() .setContext(requireContext()) diff --git a/app/src/main/java/com/casic/br/ktd/holder/SwipeViewHolder.kt b/app/src/main/java/com/casic/br/ktd/holder/SwipeViewHolder.kt index b7676e4..08c8656 100644 --- a/app/src/main/java/com/casic/br/ktd/holder/SwipeViewHolder.kt +++ b/app/src/main/java/com/casic/br/ktd/holder/SwipeViewHolder.kt @@ -49,6 +49,23 @@ } /** + * 提供TextView和Button设置文本颜色简化操作 + * + * @param idRes 控件ID + * @param color 颜色 + * @return holder + */ + fun setTextColor(@IdRes idRes: Int, color: Int): SwipeViewHolder { + val view = getView(idRes) + if (view is TextView) { + view.setTextColor(color) + } else if (view is Button) { + view.setTextColor(color) + } + return this + } + + /** * 设置指定ViewId的背景颜色 * * @param idRes 控件ID diff --git a/app/src/main/res/layout/fragment_task.xml b/app/src/main/res/layout/fragment_task.xml index 424f407..8ce604f 100644 --- a/app/src/main/res/layout/fragment_task.xml +++ b/app/src/main/res/layout/fragment_task.xml @@ -81,6 +81,17 @@ android:hint="请输入巡检任务编号" /> + + - + + + android:layout_height="match_parent"> - - - - - - - - - - - - - - - - - - - - + android:layout_height="wrap_content" /> - + - - - - - + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_task_rv_l.xml b/app/src/main/res/layout/item_task_rv_l.xml index e06ba5a..346fc84 100644 --- a/app/src/main/res/layout/item_task_rv_l.xml +++ b/app/src/main/res/layout/item_task_rv_l.xml @@ -1,6 +1,7 @@ + android:text="202304120001" + android:textSize="@dimen/sp_16" /> + android:text="永定路日常巡检任务" + android:textSize="@dimen/sp_16" /> + android:text="2023-07-05 09:40:10" + android:textSize="@dimen/sp_16" /> + android:text="2023-07-05 11:40:10" + android:textSize="@dimen/sp_16" /> + android:text="10" + android:textSize="@dimen/sp_16" /> diff --git a/app/src/main/res/layout/item_task_rv_l_title.xml b/app/src/main/res/layout/item_task_rv_l_title.xml new file mode 100644 index 0000000..782d77d --- /dev/null +++ b/app/src/main/res/layout/item_task_rv_l_title.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file