فهرست منبع

添加作业票列表界面;添加fragment基类;添加通用tab控件

Frankensteinly 1 سال پیش
والد
کامیت
ec4cfdc571

+ 1 - 0
.gitignore

@@ -8,6 +8,7 @@
 /.idea/navEditor.xml
 /.idea/assetWizardSettings.xml
 /.idea/vcs.xml
+/.idea/*
 .DS_Store
 /build
 /captures

+ 2 - 0
app/build.gradle

@@ -104,4 +104,6 @@ dependencies {
     implementation 'com.github.jzmanu:MDatePickerSample:v1.0.5'
 
     implementation 'com.wang.avi:library:2.1.3'
+
+    implementation 'androidx.viewpager2:viewpager2:1.0.0'
 }

+ 3 - 0
app/src/main/AndroidManifest.xml

@@ -21,6 +21,9 @@
         android:supportsRtl="true"
         android:theme="@style/Theme.ISCS"
         tools:targetApi="31">
+        <activity
+            android:name=".activity.TicketListActivity"
+            android:exported="false" />
         <activity
             android:name=".activity.LoginActivity"
             android:exported="false" />

+ 6 - 2
app/src/main/java/com/grkj/iscs/activity/HomeActivity.kt

@@ -16,10 +16,14 @@ class HomeActivity : BaseMvpActivity<IHomeView, HomePresenter, ActivityHomeBindi
             startActivity(Intent(this, CreateTicketActivity::class.java))
         }
         mBinding?.tvCurrent?.setOnClickListener {
-
+            startActivity(Intent(this, TicketListActivity::class.java).apply {
+                putExtra("status", "1")
+            })
         }
         mBinding?.tvHistory?.setOnClickListener {
-
+            startActivity(Intent(this, TicketListActivity::class.java).apply {
+                putExtra("status", "0")
+            })
         }
 
         mBinding?.tvExit?.setOnClickListener {

+ 27 - 0
app/src/main/java/com/grkj/iscs/activity/TicketListActivity.kt

@@ -0,0 +1,27 @@
+package com.grkj.iscs.activity
+
+import androidx.fragment.app.Fragment
+import androidx.viewpager2.adapter.FragmentStateAdapter
+import com.grkj.iscs.base.BaseActivity
+import com.grkj.iscs.databinding.ActivityTicketListBinding
+import com.grkj.iscs.fragment.TicketListFragment
+
+class TicketListActivity : BaseActivity<ActivityTicketListBinding>() {
+
+    override val viewBinding: ActivityTicketListBinding
+        get() = ActivityTicketListBinding.inflate(layoutInflater)
+
+    override fun initView() {
+        mBinding?.rvTab?.setData(mutableListOf("待办工单", "已办工单"))
+
+        mBinding?.vpList?.adapter = object : FragmentStateAdapter(this) {
+            override fun createFragment(position: Int): Fragment {
+                return TicketListFragment(position)
+            }
+
+            override fun getItemCount(): Int {
+                return 2
+            }
+        }
+    }
+}

+ 43 - 0
app/src/main/java/com/grkj/iscs/base/BaseFragment.kt

@@ -0,0 +1,43 @@
+package com.grkj.iscs.base
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import androidx.viewbinding.ViewBinding
+import com.grkj.iscs.dialog.LoadingProgressDialog
+
+abstract class BaseFragment<T : ViewBinding?> : Fragment() {
+    protected var mBinding: T? = null
+    abstract val viewBinding: T
+    private var loadingProgressDialog: LoadingProgressDialog? = null
+
+    override fun onCreateView(
+        inflater: LayoutInflater,
+        container: ViewGroup?,
+        savedInstanceState: Bundle?
+    ): View? {
+        mBinding = viewBinding
+        return mBinding!!.root
+    }
+
+    override fun onActivityCreated(savedInstanceState: Bundle?) {
+        super.onActivityCreated(savedInstanceState)
+        initView()
+    }
+
+    abstract fun initView()
+
+    fun handleLoading(isShow: Boolean, progressStr: String? = null) {
+        if (isShow) {
+            loadingProgressDialog ?: let {
+                loadingProgressDialog = context?.let { itCtx -> LoadingProgressDialog(itCtx) }
+            }
+            loadingProgressDialog?.show()
+            loadingProgressDialog?.setProgress(progressStr)
+        } else {
+            loadingProgressDialog?.dismiss()
+        }
+    }
+}

+ 27 - 0
app/src/main/java/com/grkj/iscs/base/BaseMvpFragment.kt

@@ -0,0 +1,27 @@
+package com.grkj.iscs.base
+
+import android.os.Bundle
+import androidx.viewbinding.ViewBinding
+
+/**
+ * MVP基类Fragment
+ */
+abstract class BaseMvpFragment<V : IView?, T : BasePresenter<V>?, B : ViewBinding> : BaseFragment<B>(), IView{
+    var presenter: T? = null
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        presenter = initPresenter()
+        presenter?.onCreate(this as V, this.context!!)
+        super.onCreate(savedInstanceState)
+    }
+
+    override fun onDestroy() {
+        presenter?.onDestroy()
+        super.onDestroy()
+    }
+
+    /**
+     * 实例化Presenter对象
+     */
+    abstract fun initPresenter(): T
+}

+ 21 - 0
app/src/main/java/com/grkj/iscs/fragment/TicketListFragment.kt

@@ -0,0 +1,21 @@
+package com.grkj.iscs.fragment
+
+import com.grkj.iscs.base.BaseMvpFragment
+import com.grkj.iscs.databinding.FragmentTicketListBinding
+import com.grkj.iscs.iview.ITicketListView
+import com.grkj.iscs.presenter.TicketListPresenter
+
+class TicketListFragment(var type: Int) :
+    BaseMvpFragment<ITicketListView, TicketListPresenter, FragmentTicketListBinding>() {
+
+    override val viewBinding: FragmentTicketListBinding
+        get() = FragmentTicketListBinding.inflate(layoutInflater)
+
+    override fun initView() {
+        mBinding?.tvFragment?.text = "Fragment $type"
+    }
+
+    override fun initPresenter(): TicketListPresenter {
+        return TicketListPresenter()
+    }
+}

+ 5 - 0
app/src/main/java/com/grkj/iscs/iview/ITicketListView.kt

@@ -0,0 +1,5 @@
+package com.grkj.iscs.iview
+
+import com.grkj.iscs.base.IView
+
+interface ITicketListView : IView {}

+ 6 - 0
app/src/main/java/com/grkj/iscs/presenter/TicketListPresenter.kt

@@ -0,0 +1,6 @@
+package com.grkj.iscs.presenter
+
+import com.grkj.iscs.base.BasePresenter
+import com.grkj.iscs.iview.ITicketListView
+
+class TicketListPresenter : BasePresenter<ITicketListView>() {}

+ 60 - 0
app/src/main/java/com/grkj/iscs/widget/RvTab.kt

@@ -0,0 +1,60 @@
+package com.grkj.iscs.widget
+
+import android.content.Context
+import android.util.AttributeSet
+import android.view.LayoutInflater
+import android.widget.TextView
+import androidx.constraintlayout.widget.ConstraintLayout
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+import com.grkj.iscs.R
+import com.zhy.adapter.recyclerview.CommonAdapter
+import com.zhy.adapter.recyclerview.base.ViewHolder
+
+/**
+ * 通用Tab控件
+ */
+class RvTab(context: Context, attrs: AttributeSet) : ConstraintLayout(context, attrs) {
+
+    private val rvTitle: RecyclerView
+    private val mTitleList = mutableListOf<String>()
+    private var mCurrentIdx = 0
+    var onItemClick: ((Int) -> Unit)? = null
+
+    init {
+        LayoutInflater.from(context).inflate(R.layout.layout_rv_tab, this, true)
+
+        rvTitle = findViewById(R.id.rv_title)
+
+        (rvTitle.layoutManager as LinearLayoutManager).orientation = LinearLayoutManager.HORIZONTAL
+        rvTitle.adapter = object : CommonAdapter<String>(context, R.layout.item_rv_tab, mTitleList) {
+            override fun convert(holder: ViewHolder, data: String, position: Int) {
+                holder.setText(R.id.tv_num, data)
+                holder.getView<TextView>(R.id.tv_num).isSelected = position == mCurrentIdx
+                holder.setOnClickListener(R.id.tv_num) {
+                    setSelected(position)
+                    onItemClick?.invoke(position)
+                }
+            }
+        }
+    }
+
+    /**
+     * 设置选中item
+     *
+     * @param index 下标
+     */
+    fun setSelected(index: Int) {
+        mCurrentIdx = index
+        rvTitle.adapter?.notifyDataSetChanged()
+    }
+
+    /**
+     * 填充数据
+     */
+    fun setData(list: MutableList<String>) {
+        mTitleList.clear()
+        mTitleList.addAll(list)
+        rvTitle.adapter?.notifyDataSetChanged()
+    }
+}

+ 5 - 0
app/src/main/res/drawable/common_tab_item_bg_normal.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <corners android:radius="@dimen/common_rv_tab_bg_radius" />
+    <solid android:color="@color/common_transparent" />
+</shape>

+ 5 - 0
app/src/main/res/drawable/common_tab_item_bg_selected.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <corners android:radius="@dimen/common_rv_tab_bg_radius" />
+    <solid android:color="@color/common_bg_white_30" />
+</shape>

+ 5 - 0
app/src/main/res/drawable/common_tab_item_bg_selector.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_selected="false" android:drawable="@drawable/common_tab_item_bg_normal" />
+    <item android:state_selected="true" android:drawable="@drawable/common_tab_item_bg_selected" />
+</selector>

+ 5 - 0
app/src/main/res/drawable/common_tab_item_txt_selector.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_selected="false" android:color="@color/aquamarine" />
+    <item android:state_selected="true" android:color="@color/main_color" />
+</selector>

+ 19 - 0
app/src/main/res/layout/activity_ticket_list.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/main"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    tools:context=".activity.TicketListActivity">
+
+    <com.grkj.iscs.widget.RvTab
+        android:id="@+id/rv_tab"
+        android:layout_width="wrap_content"
+        android:layout_height="40dp" />
+
+    <androidx.viewpager2.widget.ViewPager2
+        android:id="@+id/vp_list"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent" />
+</LinearLayout>

+ 13 - 0
app/src/main/res/layout/fragment_ticket_list.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".fragment.TicketListFragment">
+
+    <TextView
+        android:id="@+id/tv_fragment"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent" />
+
+</RelativeLayout>

+ 10 - 0
app/src/main/res/layout/item_rv_tab.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="@dimen/common_rv_tab_item_width"
+    android:layout_height="@dimen/common_rv_tab_item_height"
+    android:background="@drawable/common_tab_item_bg_selector"
+    android:textSize="@dimen/common_text_size"
+    android:textColor="@drawable/common_tab_item_txt_selector"
+    android:gravity="center"
+    android:layout_margin="@dimen/common_rv_tab_padding"
+    android:id="@+id/tv_num" />

+ 10 - 0
app/src/main/res/layout/layout_rv_tab.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content">
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/rv_title"
+        style="@style/CommonRecyclerView"
+        android:layout_height="wrap_content" />
+</RelativeLayout>

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

@@ -19,6 +19,13 @@
     <dimen name="home_navi_height">200dp</dimen>
     <dimen name="home_navi_width">133dp</dimen>
 
+    <!-- 通用tab -->
+    <dimen name="common_rv_tab_item_width">64dp</dimen>
+    <dimen name="common_rv_tab_item_height">19dp</dimen>
+    <dimen name="common_rv_tab_padding">6dp</dimen>
+    <dimen name="common_rv_tab_bg_radius">3dp</dimen>
+
+    <!--  输入选择控件  -->
     <dimen name="selectable_input_width">83dp</dimen>
     <dimen name="selectable_input_radius">2dp</dimen>
     <dimen name="selectable_input_stroke">1dp</dimen>