Ver Fonte

补充作业票执行步骤页控件;调试控件

Frankensteinly há 10 meses atrás
pai
commit
5c3ab828a7

+ 15 - 0
app/src/main/java/com/grkj/iscs/view/activity/test/WidgetTestActivity.kt

@@ -1,9 +1,13 @@
 package com.grkj.iscs.view.activity.test
 
+import com.grkj.iscs.R
 import com.grkj.iscs.databinding.ActivityWidgetTestBinding
 import com.grkj.iscs.util.ToastUtils
 import com.grkj.iscs.view.base.BaseActivity
 import com.grkj.iscs.view.widget.SelectableInput
+import com.grkj.iscs.view.widget.SnakeGridLayoutManager
+import com.zhy.adapter.recyclerview.CommonAdapter
+import com.zhy.adapter.recyclerview.base.ViewHolder
 
 class WidgetTestActivity : BaseActivity<ActivityWidgetTestBinding>() {
 
@@ -21,5 +25,16 @@ class WidgetTestActivity : BaseActivity<ActivityWidgetTestBinding>() {
         mBinding?.tvTest?.setOnClickListener {
             mBinding?.tvTest?.isSelected = !mBinding?.tvTest?.isSelected!!
         }
+
+        val list = mutableListOf<String>()
+        for (i in 0..500) {
+            list.add("$i")
+        }
+        mBinding?.rvSnake?.layoutManager = SnakeGridLayoutManager(this, 5)
+        mBinding?.rvSnake?.adapter = object : CommonAdapter<String>(this, R.layout.item_rv_menu, list) {
+            override fun convert(holder: ViewHolder, t: String?, position: Int) {
+                holder.setText(R.id.tv_number, t)
+            }
+        }
     }
 }

+ 32 - 1
app/src/main/java/com/grkj/iscs/view/fragment/StepFragment.kt

@@ -1,23 +1,54 @@
 package com.grkj.iscs.view.fragment
 
+import android.widget.ImageView
+import com.grkj.iscs.R
 import com.grkj.iscs.databinding.FragmentStepBinding
 import com.grkj.iscs.view.base.BaseMvpFragment
 import com.grkj.iscs.view.iview.IStepView
 import com.grkj.iscs.view.presenter.StepPresenter
+import com.zhy.adapter.recyclerview.CommonAdapter
+import com.zhy.adapter.recyclerview.base.ViewHolder
 
 /**
  * 作业票执行步骤页 - 八大步骤
  */
 class StepFragment : BaseMvpFragment<IStepView, StepPresenter, FragmentStepBinding>() {
 
+    private lateinit var mStepList: MutableList<StepBO>
+
     override val viewBinding: FragmentStepBinding
         get() = FragmentStepBinding.inflate(layoutInflater)
 
     override fun initView() {
-
+        mStepList = mutableListOf(
+            StepBO(R.mipmap.icon1, getString(R.string.recognize_work_content), false, 1),
+            StepBO(R.mipmap.icon1, getString(R.string.power_isolation_way), false, 2),
+            StepBO(R.mipmap.icon1, getString(R.string.notice_worker), false, 3),
+            StepBO(R.mipmap.icon1, getString(R.string.shutdown), false, 4),
+            StepBO(R.mipmap.icon1, getString(R.string.unlock_and_restore_switch), false, 8),
+            StepBO(R.mipmap.icon1, getString(R.string.check_before_unlocking), false, 7),
+            StepBO(R.mipmap.icon1, getString(R.string.ensure_power_isolation), false, 6),
+            StepBO(R.mipmap.icon1, getString(R.string.lock_and_hang_a_sign), false, 5)
+        )
+        mBinding?.rvStep?.adapter = object : CommonAdapter<StepBO>(requireContext(), R.layout.item_rv_step, mStepList) {
+            override fun convert(holder: ViewHolder, step: StepBO, position: Int) {
+                if (step.index == 4) {
+                    holder.setVisible(R.id.iv_arrow_right, false)
+                    holder.setVisible(R.id.iv_arrow_bottom, true)
+                } else if (step.index == 5) {
+                    holder.setVisible(R.id.iv_arrow_right, false)
+                } else if (step.index > 5) {
+                    holder.getView<ImageView>(R.id.iv_arrow_right).rotation = 180f
+                }
+                holder.setText(R.id.tv_index, step.index.toString())
+                holder.setText(R.id.tv_status, if (step.isDone) getString(R.string.executed) else getString(R.string.not_executed))
+            }
+        }
     }
 
     override fun initPresenter(): StepPresenter {
         return StepPresenter()
     }
+
+    data class StepBO(val pic: Int, val title: String, val isDone: Boolean = false, val index: Int)
 }

+ 88 - 0
app/src/main/java/com/grkj/iscs/view/widget/SnakeGridLayoutManager.kt

@@ -0,0 +1,88 @@
+package com.grkj.iscs.view.widget
+
+import android.content.Context
+import android.util.SparseArray
+import androidx.recyclerview.widget.GridLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+
+class SnakeGridLayoutManager(context: Context, spanCount: Int) : GridLayoutManager(context, spanCount) {
+
+    private val reverseOrderMap = SparseArray<Boolean>()
+
+    override fun onLayoutChildren(recycler: RecyclerView.Recycler?, state: RecyclerView.State?) {
+        // 清空之前的缓存
+        reverseOrderMap.clear()
+
+        // 调用父类的 onLayoutChildren 方法进行默认布局
+        super.onLayoutChildren(recycler, state)
+
+        // 获取所有可见的子视图
+        for (i in 0 until childCount) {
+            val view = getChildAt(i)
+            val position = getPosition(view!!)
+
+            // 计算当前项所在的行号
+            val row = position / spanCount
+
+            // 判断是否需要反转该行的排列顺序
+            if (row % 2 != 0) {
+                reverseOrderMap.put(position, true)
+            }
+        }
+
+        // 重新布局子视图
+        detachAndScrapAttachedViews(recycler!!)
+        layoutInSnakeOrder(recycler, state)
+    }
+
+    private fun layoutInSnakeOrder(recycler: RecyclerView.Recycler, state: RecyclerView.State?) {
+        var left = paddingLeft
+        var top = paddingTop
+        var right: Int
+        var bottom: Int
+
+        var row = 0
+        var col = 0
+
+        for (i in 0 until itemCount) {
+            val isReverse = reverseOrderMap.get(i, false)
+
+            if (isReverse) {
+                col = spanCount - 1 - (i % spanCount)
+            } else {
+                col = i % spanCount
+            }
+
+            if (col == 0 && i > 0) {
+                row++
+                left = paddingLeft
+                top += getHeightForPosition(i - 1) + verticalSpaceItemDecoration
+            }
+
+            val view = recycler.getViewForPosition(i)
+            addView(view)
+
+            measureChildWithMargins(view, 0, 0)
+
+            right = left + getWidthForPosition(i)
+            bottom = top + getHeightForPosition(i)
+
+            layoutDecorated(view, left, top, right, bottom)
+
+            left += getWidthForPosition(i) + horizontalSpaceItemDecoration
+        }
+    }
+
+    private fun getWidthForPosition(position: Int): Int {
+        return width / spanCount
+    }
+
+    private fun getHeightForPosition(position: Int): Int {
+        return height / spanCount
+    }
+
+    companion object {
+        private const val horizontalSpaceItemDecoration = 0
+        private const val verticalSpaceItemDecoration = 0
+    }
+}

+ 9 - 3
app/src/main/res/layout/activity_widget_test.xml

@@ -21,9 +21,15 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:background="@drawable/test_status_bg_selector"
-        android:textColor="@drawable/test_status_color_selector"
-        android:gravity="center"
         android:drawableLeft="@drawable/pwd_toggle_bg_selector"
+        android:gravity="center"
+        android:padding="3dp"
         android:text="已解锁"
-        android:padding="3dp"/>
+        android:textColor="@drawable/test_status_color_selector" />
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/rv_snake"
+        style="@style/CommonRecyclerView"
+        android:layout_height="wrap_content"
+        android:background="@color/main_color" />
 </LinearLayout>

+ 1 - 0
app/src/main/res/layout/fragment_step.xml

@@ -70,6 +70,7 @@
         android:text="@string/cancel_the_job" />
 
     <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/rv_step"
         style="@style/CommonRecyclerView"
         android:layout_above="@id/tv_cancel"
         android:layout_below="@id/tv_title"

+ 41 - 18
app/src/main/res/layout/item_rv_step.xml

@@ -1,25 +1,48 @@
 <?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/root"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:orientation="vertical">
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content">
 
-    <TextView
-        android:id="@+id/tv_status"
-        style="@style/CommonTextView" />
+    <LinearLayout
+        android:id="@+id/ll_step"
+        android:layout_width="@dimen/item_rv_step_width"
+        android:layout_height="@dimen/item_rv_step_height"
+        android:orientation="vertical">
 
-    <ImageView
-        android:id="@+id/iv_icon"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content" />
+        <TextView
+            android:id="@+id/tv_status"
+            style="@style/CommonTextView" />
+
+        <ImageView
+            android:id="@+id/iv_icon"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content" />
+
+        <TextView
+            android:id="@+id/tv_name"
+            style="@style/CommonTextView" />
 
-    <TextView
-        android:id="@+id/tv_name"
-        style="@style/CommonTextView" />
+        <TextView
+            android:id="@+id/tv_index"
+            style="@style/CommonTextView" />
+    </LinearLayout>
 
-    <TextView
-        android:id="@+id/tv_index"
-        style="@style/CommonTextView" />
+    <ImageView
+        android:id="@+id/iv_arrow_right"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_centerVertical="true"
+        android:layout_toRightOf="@id/ll_step"
+        android:background="@mipmap/back" />
 
-</LinearLayout>
+    <ImageView
+        android:id="@+id/iv_arrow_bottom"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_below="@id/ll_step"
+        android:layout_centerHorizontal="true"
+        android:background="@mipmap/back"
+        android:rotation="270"
+        android:visibility="gone" />
+</RelativeLayout>

+ 3 - 0
app/src/main/res/values/dimens.xml

@@ -63,4 +63,7 @@
     <dimen name="item_rv_technology_type_padding">2dp</dimen>
     <dimen name="dialog_tip_width">256dp</dimen>
     <dimen name="dialog_tip_height">144dp</dimen>
+    
+    <dimen name="item_rv_step_width">45dp</dimen>
+    <dimen name="item_rv_step_height">80dp</dimen>
 </resources>

+ 10 - 0
app/src/main/res/values/strings.xml

@@ -115,4 +115,14 @@
     <string name="finish_the_job">结束作业</string>
     <string name="cancel_the_job">取消作业</string>
     <string name="action_confirm">操作确认</string>
+    <string name="executed">已执行</string>
+    <string name="not_executed">待执行</string>
+    <string name="recognize_work_content">识别工作内容</string>
+    <string name="power_isolation_way">能源隔离方式</string>
+    <string name="notice_worker">通知人员</string>
+    <string name="shutdown">操作停机</string>
+    <string name="lock_and_hang_a_sign">上锁挂牌</string>
+    <string name="ensure_power_isolation">能量隔离证实</string>
+    <string name="check_before_unlocking">取锁前检查</string>
+    <string name="unlock_and_restore_switch">拆锁恢复开关</string>
 </resources>