From bd4891e2fd6b773cbb0ec387f6db4bc944fdf51a Mon Sep 17 00:00:00 2001
From: zuoxiao <470321431@qq.com>
Date: 星期一, 31 三月 2025 18:07:51 +0800
Subject: [PATCH] feat(generallibrary): 添加卡片列表功能并优化登录逻辑

---
 generallibrary/src/main/java/com/dayu/general/net/NetConstans.kt           |    4 
 generallibrary/src/main/java/com/dayu/general/activity/BSCardFragment.kt   |    2 
 app/src/main/AndroidManifest.xml                                           |    5 
 generallibrary/src/main/java/com/dayu/general/view/CardSearchDialog.kt     |   74 ++++++
 generallibrary/src/main/java/com/dayu/general/activity/MyFragment.kt       |   18 +
 app/src/main/java/com/dayu/recharge/MyApplication.java                     |    3 
 generallibrary/src/main/res/layout/dialog_card_search.xml                  |  142 ++++++++++++
 generallibrary/src/main/res/layout/activity_card_list.xml                  |   45 ++++
 baselibrary/src/main/res/layout/confirm_dialog.xml                         |    4 
 generallibrary/src/main/AndroidManifest.xml                                |    1 
 generallibrary/src/main/res/layout/item_card_list.xml                      |  104 +++++++++
 generallibrary/src/main/res/values/colors.xml                              |    1 
 generallibrary/src/main/java/com/dayu/general/activity/CardListActivity.kt |  209 ++++++++++++++++++
 app/build.gradle                                                           |    2 
 14 files changed, 599 insertions(+), 15 deletions(-)

diff --git a/app/build.gradle b/app/build.gradle
index cd537e8..6a96054 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -3,7 +3,7 @@
 android {
     signingConfigs {
         debug {
-            storeFile file(myValue)
+            storeFile file("${project.rootDir}/dycz.jks")
             storePassword 'dycz@2023'
             keyAlias 'dayu'
             keyPassword 'dycz@2023'
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 7d52f81..c0de339 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -48,6 +48,11 @@
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
+            <!-- 娣诲姞鑷畾涔塧ction鐨刬ntent-filter锛岀敤浜庝粠generallibrary涓惎鍔ㄦActivity -->
+            <intent-filter>
+                <action android:name="com.dayu.recharge.action.LOGIN" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
         </activity>
         <meta-data
             android:name="BUGLY_APP_VERSION"
diff --git a/app/src/main/java/com/dayu/recharge/MyApplication.java b/app/src/main/java/com/dayu/recharge/MyApplication.java
index 1aa6969..0aa434c 100644
--- a/app/src/main/java/com/dayu/recharge/MyApplication.java
+++ b/app/src/main/java/com/dayu/recharge/MyApplication.java
@@ -1,6 +1,5 @@
 package com.dayu.recharge;
 
-import android.app.Activity;
 import android.app.Application;
 import android.content.Context;
 import android.content.Intent;
@@ -41,6 +40,7 @@
         } catch (Exception e) {
             e.printStackTrace();
         }
+        
         initApplication();
         BaseApplication.getInstance().onCreat(this);
         CrashReport.initCrashReport(getApplicationContext(), "45551598b8", true);
@@ -70,6 +70,7 @@
                         break;
                     case BaseCommon.Generalv1Library:
                         com.dayu.general.BaseApplication.getInstance(this);
+                        BusinessProvider.getInstance(this);
                         break;
                 }
             }
diff --git a/baselibrary/src/main/res/layout/confirm_dialog.xml b/baselibrary/src/main/res/layout/confirm_dialog.xml
index 109888b..32e0b2a 100644
--- a/baselibrary/src/main/res/layout/confirm_dialog.xml
+++ b/baselibrary/src/main/res/layout/confirm_dialog.xml
@@ -42,7 +42,7 @@
 
         <View
             android:layout_width="match_parent"
-            android:layout_height="2px"
+            android:layout_height="1dp"
             android:layout_marginTop="20dp"
             android:background="@color/line_bg" />
 
@@ -64,7 +64,7 @@
                 android:textSize="20sp" />
 
             <View
-                android:layout_width="2px"
+                android:layout_width="1dp"
                 android:layout_height="match_parent"
                 android:background="@color/line_bg" />
 
diff --git a/generallibrary/src/main/AndroidManifest.xml b/generallibrary/src/main/AndroidManifest.xml
index 99e8411..32912b8 100644
--- a/generallibrary/src/main/AndroidManifest.xml
+++ b/generallibrary/src/main/AndroidManifest.xml
@@ -71,6 +71,7 @@
                 <data android:mimeType="text/plain" />
             </intent-filter>
         </activity>
+        <activity android:name=".activity.CardListActivity"/>
 
 
 
diff --git a/generallibrary/src/main/java/com/dayu/general/activity/BSCardFragment.kt b/generallibrary/src/main/java/com/dayu/general/activity/BSCardFragment.kt
index b89fecf..2a5ad7c 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/BSCardFragment.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/BSCardFragment.kt
@@ -43,7 +43,7 @@
             startActivity(intent)
         }
         binding?.homeLossLL?.setOnClickListener {
-            val intent = Intent(context, SearchUserActivity::class.java).apply{
+            val intent = Intent(context, CardListActivity::class.java).apply{
                 putExtra("type", "loss")
             }
             startActivity(intent)
diff --git a/generallibrary/src/main/java/com/dayu/general/activity/CardListActivity.kt b/generallibrary/src/main/java/com/dayu/general/activity/CardListActivity.kt
index bfd1ded..43874cd 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/CardListActivity.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/CardListActivity.kt
@@ -1,9 +1,216 @@
 package com.dayu.general.activity
 
-class CardListActivity:BaseActivity() {
+import android.os.Bundle
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.dayu.baselibrary.net.subscribers.SubscriberListener
+import com.dayu.baselibrary.utils.ToastUtil
+import com.dayu.baselibrary.view.TitleBar.ClickType_LEFT_IMAGE
+import com.dayu.baselibrary.view.TitleBar.ClickType_RIGHT_IMAGE
+import com.dayu.general.adapter.CardListAdapter
+import com.dayu.general.bean.net.SearchCardResult
+import com.dayu.general.databinding.ActivityCardListBinding
+import com.dayu.general.view.CardSearchDialog
+import com.dayu.general.net.ApiManager
+import com.dayu.general.net.BaseResponse
+import com.scwang.smart.refresh.layout.api.RefreshLayout
+import com.scwang.smart.refresh.layout.listener.OnRefreshLoadMoreListener
 
+/**
+ * @author: zuo
+ * @date: 2023/3/31
+ * @description: 鍗$墖鍒楄〃鐣岄潰
+ */
+class CardListActivity : BaseActivity() {
 
+    var binding: ActivityCardListBinding? = null
+    private var cardAdapter: CardListAdapter? = null
+    var searchDialog: CardSearchDialog? = null
+    
+    // 鍒嗛〉鐩稿叧鍙橀噺
+    private var currentPage = 1
+    private val pageSize = 20
+    private var hasMoreData = true
+    
+    // 淇濆瓨褰撳墠鎼滅储鏉′欢
+    private var currentCardNumber = ""
+    private var currentClientNumber = ""
+    private var currentClientName = ""
 
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        binding = ActivityCardListBinding.inflate(layoutInflater)
+        setContentView(binding?.root)
+        initView()
+        setupRecyclerView()
+        setupRefreshLayout()
+    }
 
+    fun initView() {
+        searchDialog = CardSearchDialog(this)
+        searchDialog?.show()
+        binding?.titleBar?.setOnItemclickListner(ClickType_LEFT_IMAGE) { this.finish() }
+        // 璁剧疆鎼滅储鐩戝惉鍣�
+        searchDialog?.setOnSearchListener(object : CardSearchDialog.OnSearchListener {
+            override fun onSearch(cardNumber: String, clientNumber: String, clientName: String) {
+                // 淇濆瓨褰撳墠鎼滅储鏉′欢
+                currentCardNumber = cardNumber
+                currentClientNumber = clientNumber
+                currentClientName = clientName
+                
+                // 閲嶇疆鍒嗛〉鐘舵��
+                currentPage = 1
+                hasMoreData = true
+                
+                // 鎵ц鎼滅储
+                searchCards(cardNumber, clientNumber, clientName, true)
+            }
+        })
+        binding?.titleBar?.setOnItemclickListner(ClickType_RIGHT_IMAGE) {
+            // 鏄剧ず鎼滅储瀵硅瘽妗�
+            searchDialog?.show()
+        }
+    }
 
+    private fun setupRecyclerView() {
+        cardAdapter = CardListAdapter()
+        binding?.recyclerView?.apply {
+            layoutManager = LinearLayoutManager(this@CardListActivity)
+            adapter = cardAdapter
+        }
+        
+        // 璁剧疆鍒楄〃椤圭偣鍑讳簨浠�
+        cardAdapter?.setOnItemClickListener { card ->
+            // 澶勭悊鍗$墖鐐瑰嚮浜嬩欢
+            ToastUtil.show("宸查�夋嫨鍗$墖锛�${card.cardNum}")
+            // 杩欓噷鍙互娣诲姞璺宠浆鍒板崱鐗囪鎯呴〉闈㈢殑閫昏緫
+            // val intent = Intent(this, CardDetailActivity::class.java)
+            // intent.putExtra("cardNum", card.cardNum)
+            // startActivity(intent)
+        }
+    }
+    
+    private fun setupRefreshLayout() {
+        binding?.refreshLayout?.apply {
+            // 璁剧疆鍒锋柊鍜屽姞杞芥洿澶氱洃鍚櫒
+            setOnRefreshLoadMoreListener(object : OnRefreshLoadMoreListener {
+                override fun onRefresh(refreshLayout: RefreshLayout) {
+                    // 閲嶇疆椤电爜骞跺埛鏂版暟鎹�
+                    currentPage = 1
+                    hasMoreData = true
+                    searchCards(currentCardNumber, currentClientNumber, currentClientName, true)
+                }
+                
+                override fun onLoadMore(refreshLayout: RefreshLayout) {
+                    // 濡傛灉杩樻湁鏇村鏁版嵁锛屽姞杞戒笅涓�椤�
+                    if (hasMoreData) {
+                        currentPage++
+                        searchCards(currentCardNumber, currentClientNumber, currentClientName, false)
+                    } else {
+                        // 瀹屾垚鍔犺浇骞舵彁绀烘病鏈夋洿澶氭暟鎹�
+                        refreshLayout.finishLoadMore(500, true, false)
+                        ToastUtil.show("娌℃湁鏇村鏁版嵁浜�")
+                    }
+                }
+            })
+        }
+    }
+
+    /**
+     * 鏍规嵁鍗″彿銆佸鎴风紪鍙峰拰瀹㈡埛濮撳悕鎼滅储鍗$墖
+     *
+     * 姝ゅ嚱鏁版瀯寤轰竴涓弬鏁版槧灏勶紝鏍规嵁鎻愪緵鐨勫崱鍙枫�佸鎴风紪鍙峰拰瀹㈡埛濮撳悕鏉ユ悳绱㈠崱鐗�
+     * 瀹冧粎鍖呭惈鏈夋晥鐨勩�侀潪绌虹殑鎼滅储鍙傛暟锛屼互纭繚鎼滅储璇锋眰鐨勫噯纭�у拰鏁堢巼
+     *
+     * @param cardNumber 鍗″彿
+     * @param clientNumber 瀹㈡埛缂栧彿
+     * @param clientName 瀹㈡埛濮撳悕
+     * @param isRefresh 鏄惁涓哄埛鏂版搷浣�
+     */
+    private fun searchCards(cardNumber: String, clientNumber: String, clientName: String, isRefresh: Boolean = true) {
+        val map = mutableMapOf<String, Any>()
+
+        if (cardNumber.isNotEmpty()) {
+            map["cardNum"] = cardNumber
+        }
+
+        if (clientNumber.isNotEmpty()) {
+            map["clientNum"] = clientNumber
+        }
+
+        if (clientName.isNotEmpty()) {
+            map["clientName"] = clientName
+        }
+        
+        // 娣诲姞鍒嗛〉鍙傛暟
+        map["pageCurr"] = currentPage
+        map["pageSize"] = pageSize
+
+        // 浣跨敤姝g‘鐨勭被鍨嬪弬鏁�
+        ApiManager.getInstance().requestGetLoading(
+            this,
+            "sell/clientcard/getcards",
+            SearchCardResult::class.java,
+            map,
+            object : SubscriberListener<BaseResponse<SearchCardResult>>() {
+                override fun onNext(t: BaseResponse<SearchCardResult>) {
+                    // 瀹屾垚鍒锋柊鎴栧姞杞藉姩浣�
+                    finishRefreshOrLoad(isRefresh)
+                    
+                    if (t.success) {
+                        // 澶勭悊鎼滅储鎴愬姛鐨勬儏鍐�
+                        val result = t.content
+                        if (result != null) {
+                            // 澶勭悊鎼滅储缁撴灉
+                            if (result.obj.isNotEmpty()) {
+                                // 鏍规嵁鏄惁涓哄埛鏂版搷浣滃喅瀹氬浣曟洿鏂版暟鎹�
+                                if (isRefresh) {
+                                    cardAdapter?.setData(result.obj)
+                                } else {
+                                    cardAdapter?.addData(result.obj)
+                                }
+                                
+                                // 鍒ゆ柇鏄惁杩樻湁鏇村鏁版嵁锛氭牴鎹綋鍓嶉〉鐮佸拰鎬婚〉鏁板垽鏂�
+                                hasMoreData = currentPage < result.pageTotal
+                            } else {
+                                if (isRefresh) {
+                                    cardAdapter?.setData(emptyList())
+                                    ToastUtil.show("鏈壘鍒板尮閰嶇殑鍗$墖")
+                                } else {
+                                    hasMoreData = false
+                                    ToastUtil.show("娌℃湁鏇村鏁版嵁浜�")
+                                }
+                            }
+                        } else {
+                            if (isRefresh) {
+                                cardAdapter?.setData(emptyList())
+                                ToastUtil.show("鏈壘鍒板尮閰嶇殑鍗$墖")
+                            }
+                        }
+                    } else {
+                        // 澶勭悊鎼滅储澶辫触鐨勬儏鍐�
+                        ToastUtil.show(t.msg)
+                    }
+                }
+
+                override fun onError(e: Throwable?) {
+                    super.onError(e)
+                    // 瀹屾垚鍒锋柊鎴栧姞杞藉姩浣�
+                    finishRefreshOrLoad(isRefresh)
+                    ToastUtil.show("鎼滅储澶辫触: ${e?.message ?: "鏈煡閿欒"}")
+                }
+            }
+        )
+    }
+    
+    /**
+     * 瀹屾垚鍒锋柊鎴栧姞杞芥搷浣�
+     * @param isRefresh 鏄惁涓哄埛鏂版搷浣�
+     */
+    private fun finishRefreshOrLoad(isRefresh: Boolean) {
+        if (isRefresh) {
+            binding?.refreshLayout?.finishRefresh(true)
+        } else {
+            binding?.refreshLayout?.finishLoadMore(true)
+        }
+    }
 }
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/activity/MyFragment.kt b/generallibrary/src/main/java/com/dayu/general/activity/MyFragment.kt
index bb3bf41..0276426 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/MyFragment.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/MyFragment.kt
@@ -1,11 +1,12 @@
 package com.dayu.general.activity
 
-import android.content.Intent
 import android.os.Bundle
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
 import androidx.fragment.app.Fragment
+import com.dayu.baselibrary.business.BusinessProvider
+import com.dayu.baselibrary.view.ConfirmDialog
 import com.dayu.general.BaseApplication
 import com.dayu.general.databinding.FragmentMyBinding
 
@@ -18,7 +19,10 @@
     ): View? {
         binding = FragmentMyBinding.inflate(inflater, container, false)
         binding?.logoutRL?.setOnClickListener {
-            logout()
+            ConfirmDialog(requireContext(), "鎻愮ず", "纭畾瑕侀��鍑虹櫥褰曞悧锛�") {
+                logout()
+            }.show()
+
         }
         return binding?.root
     }
@@ -51,10 +55,10 @@
         binding?.myName?.text = "鏈櫥褰�"
         binding?.myPhone?.text = "鏈櫥褰�"
         binding?.myAdName?.text = "鏈櫥褰�"
-        var intent= Intent(activity,LoginActivity::class.java)
-        startActivity(intent)
-        activity?.finish()
+
+        // 浣跨敤璺敱绠$悊鍣ㄨ烦杞埌鐧诲綍椤甸潰
+        context?.let {
+            BusinessProvider.getBusinessProvider().startLoginNavigotor.navigateToLogin(context)
+        }
     }
-
-
 }
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/net/NetConstans.kt b/generallibrary/src/main/java/com/dayu/general/net/NetConstans.kt
index 8e10e79..42a877f 100644
--- a/generallibrary/src/main/java/com/dayu/general/net/NetConstans.kt
+++ b/generallibrary/src/main/java/com/dayu/general/net/NetConstans.kt
@@ -7,8 +7,8 @@
  */
 class NetConstans {
     companion object {
-//        const val BASE_URL: String = "https://no253541tf71.vicp.fun/"
-        const val BASE_URL: String = "http://192.168.40.166:54321/"
+        const val BASE_URL: String = "https://no253541tf71.vicp.fun/"
+//        const val BASE_URL: String = "http://192.168.40.166:54321/"
 
         const val TOKEN_INVALID: String = "0000"
     }
diff --git a/generallibrary/src/main/java/com/dayu/general/view/CardSearchDialog.kt b/generallibrary/src/main/java/com/dayu/general/view/CardSearchDialog.kt
new file mode 100644
index 0000000..cf0d808
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/view/CardSearchDialog.kt
@@ -0,0 +1,74 @@
+package com.dayu.general.view
+
+import android.app.Dialog
+import android.content.Context
+import android.os.Bundle
+import android.view.Gravity
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import com.dayu.general.databinding.DialogCardSearchBinding
+
+/**
+ * 鍗$墖鎼滅储瀵硅瘽妗�
+ * 鐢ㄤ簬鎼滅储鍗″彿銆佸鎴风紪鍙枫�佸鎴峰鍚�
+ */
+class CardSearchDialog(context: Context) : Dialog(context) {
+
+    private lateinit var binding: DialogCardSearchBinding
+    private var onSearchListener: OnSearchListener? = null
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        binding = DialogCardSearchBinding.inflate(LayoutInflater.from(context))
+        setContentView(binding.root)
+
+        // 璁剧疆瀵硅瘽妗嗗搴︿负灞忓箷瀹藉害鐨�85%
+        window?.apply {
+            val params = attributes
+            params.width = (context.resources.displayMetrics.widthPixels * 0.85).toInt()
+            params.height = ViewGroup.LayoutParams.WRAP_CONTENT
+            params.gravity = Gravity.CENTER
+            attributes = params
+            setBackgroundDrawableResource(android.R.color.transparent)
+        }
+
+        // 璁剧疆鐐瑰嚮澶栭儴涓嶅彇娑堝璇濇
+        setCanceledOnTouchOutside(false)
+
+        // 璁剧疆鎼滅储鎸夐挳鐐瑰嚮浜嬩欢
+        binding.btnSearch.setOnClickListener {
+            val cardNumber = binding.etCardNumber.text.toString().trim()
+            val clientNumber = binding.etClientNumber.text.toString().trim()
+            val clientName = binding.etClientName.text.toString().trim()
+            
+            // 鍥炶皟鎼滅储浜嬩欢
+            onSearchListener?.onSearch(cardNumber, clientNumber, clientName)
+            dismiss()
+        }
+        
+        // 璁剧疆鍙栨秷鎸夐挳鐐瑰嚮浜嬩欢
+        binding.tvCancel.setOnClickListener {
+            dismiss()
+        }
+    }
+
+    /**
+     * 璁剧疆鎼滅储鐩戝惉鍣�
+     */
+    fun setOnSearchListener(listener: OnSearchListener) {
+        this.onSearchListener = listener
+    }
+
+    /**
+     * 鎼滅储鐩戝惉鍣ㄦ帴鍙�
+     */
+    interface OnSearchListener {
+        /**
+         * 鎼滅储鍥炶皟鏂规硶
+         * @param cardNumber 鍗″彿
+         * @param clientNumber 瀹㈡埛缂栧彿
+         * @param clientName 瀹㈡埛濮撳悕
+         */
+        fun onSearch(cardNumber: String, clientNumber: String, clientName: String)
+    }
+} 
\ No newline at end of file
diff --git a/generallibrary/src/main/res/layout/activity_card_list.xml b/generallibrary/src/main/res/layout/activity_card_list.xml
new file mode 100644
index 0000000..5a14bb8
--- /dev/null
+++ b/generallibrary/src/main/res/layout/activity_card_list.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    tools:context=".activity.CardListActivity">
+
+    <com.dayu.baselibrary.view.TitleBar
+        android:id="@+id/title_bar"
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/dimen_title_height"
+        app:centerText="鍗$墖鍒楄〃"
+        app:layout_constraintTop_toTopOf="parent"
+        app:leftImage="@mipmap/icon_back"
+        app:rightImage="@mipmap/icon_search" />
+
+    <com.scwang.smart.refresh.layout.SmartRefreshLayout
+        android:id="@+id/refresh_layout"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        app:srlAccentColor="@color/colorPrimary"
+        app:srlEnablePreviewInEditMode="true">
+
+        <com.scwang.smart.refresh.header.ClassicsHeader
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content" />
+
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/recycler_view"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:paddingTop="8dp"
+            android:paddingBottom="8dp"
+            android:clipToPadding="false"
+            android:overScrollMode="never" />
+
+        <com.scwang.smart.refresh.footer.ClassicsFooter
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content" />
+
+    </com.scwang.smart.refresh.layout.SmartRefreshLayout>
+
+</LinearLayout> 
\ No newline at end of file
diff --git a/generallibrary/src/main/res/layout/dialog_card_search.xml b/generallibrary/src/main/res/layout/dialog_card_search.xml
new file mode 100644
index 0000000..840da8d
--- /dev/null
+++ b/generallibrary/src/main/res/layout/dialog_card_search.xml
@@ -0,0 +1,142 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:background="@drawable/search_dialog_bg"
+    android:padding="20dp">
+
+    <TextView
+        android:id="@+id/tv_title"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="鍗$墖鎼滅储"
+        android:textColor="@color/black"
+        android:textSize="20sp"
+        android:textStyle="bold"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <View
+        android:id="@+id/divider"
+        android:layout_width="match_parent"
+        android:layout_height="1dp"
+        android:layout_marginTop="12dp"
+        android:background="#E0E0E0"
+        app:layout_constraintTop_toBottomOf="@id/tv_title" />
+
+    <TextView
+        android:id="@+id/tv_card_number_label"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="16dp"
+        android:text="鍗″彿"
+        android:textColor="#666666"
+        android:textSize="14sp"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/divider" />
+
+    <EditText
+        android:id="@+id/et_card_number"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="6dp"
+        android:background="@drawable/edit_text_bg"
+        android:hint="璇疯緭鍏ュ崱鍙�"
+        android:inputType="text"
+        android:singleLine="true"
+        android:textColorHint="#BBBBBB"
+        android:textSize="15sp"
+        app:layout_constraintTop_toBottomOf="@id/tv_card_number_label" />
+
+    <TextView
+        android:id="@+id/tv_client_number_label"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="14dp"
+        android:text="瀹㈡埛缂栧彿"
+        android:textColor="#666666"
+        android:textSize="14sp"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/et_card_number" />
+
+    <EditText
+        android:id="@+id/et_client_number"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="6dp"
+        android:background="@drawable/edit_text_bg"
+        android:hint="璇疯緭鍏ュ鎴风紪鍙�"
+        android:inputType="text"
+        android:singleLine="true"
+        android:textColorHint="#BBBBBB"
+        android:textSize="15sp"
+        app:layout_constraintTop_toBottomOf="@id/tv_client_number_label" />
+
+    <TextView
+        android:id="@+id/tv_client_name_label"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="14dp"
+        android:text="瀹㈡埛濮撳悕"
+        android:textColor="#666666"
+        android:textSize="14sp"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/et_client_number" />
+
+    <EditText
+        android:id="@+id/et_client_name"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="6dp"
+        android:background="@drawable/edit_text_bg"
+        android:hint="璇疯緭鍏ュ鎴峰鍚�"
+        android:inputType="text"
+        android:singleLine="true"
+        android:textColorHint="#BBBBBB"
+        android:textSize="15sp"
+        app:layout_constraintTop_toBottomOf="@id/tv_client_name_label" />
+
+    <Button
+        android:id="@+id/tv_cancel"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="24dp"
+        android:layout_marginEnd="6dp"
+        android:background="@drawable/cancel_button_ripple"
+        android:clickable="true"
+        android:focusable="true"
+        android:paddingTop="10dp"
+        android:paddingBottom="10dp"
+        android:stateListAnimator="@null"
+        android:text="鍙栨秷"
+        android:textColor="#666666"
+        android:textSize="15sp"
+        app:layout_constraintEnd_toStartOf="@id/btn_search"
+        app:layout_constraintHorizontal_chainStyle="packed"
+        app:layout_constraintHorizontal_weight="1"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/et_client_name" />
+
+    <Button
+        android:id="@+id/btn_search"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="6dp"
+        android:background="@drawable/search_button_ripple"
+        android:clickable="true"
+        android:elevation="2dp"
+        android:focusable="true"
+        android:paddingTop="12dp"
+        android:paddingBottom="12dp"
+        android:stateListAnimator="@null"
+        android:text="鎼滅储"
+        android:textColor="@android:color/white"
+        android:textSize="16sp"
+        android:textStyle="bold"
+        app:layout_constraintBaseline_toBaselineOf="@id/tv_cancel"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintHorizontal_weight="1"
+        app:layout_constraintStart_toEndOf="@id/tv_cancel" />
+
+</androidx.constraintlayout.widget.ConstraintLayout> 
\ No newline at end of file
diff --git a/generallibrary/src/main/res/layout/item_card_list.xml b/generallibrary/src/main/res/layout/item_card_list.xml
new file mode 100644
index 0000000..c470e47
--- /dev/null
+++ b/generallibrary/src/main/res/layout/item_card_list.xml
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:layout_marginHorizontal="12dp"
+    android:layout_marginVertical="6dp"
+    app:cardCornerRadius="8dp"
+    app:cardElevation="2dp">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="vertical"
+        android:padding="12dp">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal">
+
+            <TextView
+                android:id="@+id/tv_card_number"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:text="鍗″彿锛�5323281010060000"
+                android:textColor="@color/black"
+                android:textSize="16sp"
+                android:textStyle="bold" />
+
+            <TextView
+                android:id="@+id/tv_card_status"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="鐘舵�侊細姝e父"
+                android:textColor="@color/green"
+                android:textSize="14sp" />
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="8dp"
+            android:orientation="horizontal">
+
+            <TextView
+                android:id="@+id/tv_card_type"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:text="鍗$被鍨嬶細鍐滄埛鍗�"
+                android:textColor="@color/black"
+                android:textSize="14sp" />
+
+            <TextView
+                android:id="@+id/tv_card_balance"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="浣欓锛�90.97 鍏�"
+                android:textColor="@color/black"
+                android:textSize="14sp"
+                android:textStyle="bold" />
+        </LinearLayout>
+
+        <TextView
+            android:id="@+id/tv_client_name"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="8dp"
+            android:text="濮撳悕锛氭潕鍥�"
+            android:textColor="@color/black"
+            android:textSize="14sp" />
+
+        <TextView
+            android:id="@+id/tv_client_num"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="4dp"
+            android:text="瀹㈡埛缂栧彿锛�281010060002"
+            android:textColor="@color/black"
+            android:textSize="14sp" />
+
+        <TextView
+            android:id="@+id/tv_phone"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="4dp"
+            android:text="鐢佃瘽锛�156****4561"
+            android:textColor="@color/black"
+            android:textSize="14sp" />
+
+        <TextView
+            android:id="@+id/tv_id_card"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="4dp"
+            android:text="韬唤璇侊細3402****1245"
+            android:textColor="@color/black"
+            android:textSize="14sp"
+            android:visibility="visible" />
+
+    </LinearLayout>
+</androidx.cardview.widget.CardView> 
\ No newline at end of file
diff --git a/generallibrary/src/main/res/values/colors.xml b/generallibrary/src/main/res/values/colors.xml
index 5729a42..b812742 100644
--- a/generallibrary/src/main/res/values/colors.xml
+++ b/generallibrary/src/main/res/values/colors.xml
@@ -5,5 +5,6 @@
     <color name="white">#fff</color>
     <color name="nav_item_color">#555555</color>
     <color name="base_list_bg">#e6e6e6</color>
+    <color name="green">#32CD32</color>
 
 </resources>
\ No newline at end of file

--
Gitblit v1.8.0