ProGo 4 лет назад
Родитель
Сommit
33fe9671bb

+ 25 - 0
RMA/app/src/main/java/cn/muchinfo/rma/netManage/utils/MyOkHttpUtils.kt

@@ -2,6 +2,7 @@ package cn.muchinfo.rma.netManage.utils
 
 import cn.muchinfo.rma.global.GlobalDataCollention
 import cn.muchinfo.rma.netManage.base.ResponseCallback
+import com.blankj.utilcode.util.LogUtils
 import com.zhy.http.okhttp.OkHttpUtils
 import com.zhy.http.okhttp.callback.StringCallback
 
@@ -19,6 +20,10 @@ class MyOkHttpUtils {
      * @param callback ResponseCallback<*>
      */
     fun queryCommon(URL: String,params: Map<String, String>,statementid : String,callback: StringCallback){
+        if (!(URL.contains("http") || URL.contains("https"))) { // Expected URL scheme 'http' or 'https' but no colon was found
+            LogUtils.e("Expected URL scheme 'http' or 'https' but no colon was found")
+            return
+        }
         val json = JSONObject()
         params.forEach {
             json.put(it.key,it.value)
@@ -44,6 +49,10 @@ class MyOkHttpUtils {
         type: String,
         callback: ResponseCallback<*>
     ) {
+        if (!(URL.contains("http") || URL.contains("https"))) { // Expected URL scheme 'http' or 'https' but no colon was found
+            LogUtils.e("Expected URL scheme 'http' or 'https' but no colon was found")
+            return
+        }
         when (type) {
             "1" -> {
                 queryGet(URL = URL, params = params, callback = callback)
@@ -65,6 +74,10 @@ class MyOkHttpUtils {
      * @param params Map<String, Any> 参数
      */
     private fun queryGet(URL: String, callback: ResponseCallback<*>, params: Map<String, String>) {
+        if (!(URL.contains("http") || URL.contains("https"))) { // Expected URL scheme 'http' or 'https' but no colon was found
+            LogUtils.e("Expected URL scheme 'http' or 'https' but no colon was found")
+            return
+        }
         OkHttpUtils.get()
             .url(URL)
             .params(params)
@@ -80,6 +93,10 @@ class MyOkHttpUtils {
      * @param params Map<String, Any> 参数
      */
     fun queryGetForUrl(URL: String, callback: ResponseCallback<*>, params: Map<String, String>) {
+        if (!(URL.contains("http") || URL.contains("https"))) { // Expected URL scheme 'http' or 'https' but no colon was found
+            LogUtils.e("Expected URL scheme 'http' or 'https' but no colon was found")
+            return
+        }
         OkHttpUtils.get()
             .url(URL)
             .params(params)
@@ -94,6 +111,10 @@ class MyOkHttpUtils {
      * @param params Map<String, String> 参数
      */
     private fun queryPost(URL: String, callback: ResponseCallback<*>, params: Map<String, String>) {
+        if (!(URL.contains("http") || URL.contains("https"))) { // Expected URL scheme 'http' or 'https' but no colon was found
+            LogUtils.e("Expected URL scheme 'http' or 'https' but no colon was found")
+            return
+        }
         OkHttpUtils.post()
             .url(URL)
             .params(params)
@@ -114,6 +135,10 @@ class MyOkHttpUtils {
         callback: ResponseCallback<*>,
         params: Map<String, Any>
     ) {
+        if (!(URL.contains("http") || URL.contains("https"))) { // Expected URL scheme 'http' or 'https' but no colon was found
+            LogUtils.e("Expected URL scheme 'http' or 'https' but no colon was found")
+            return
+        }
         val json = JSONObject()
         params.forEach {
             json.put(it.key, it.value)

+ 1 - 0
RMA/app/src/main/java/cn/muchinfo/rma/view/base/BaseFragment.kt

@@ -84,6 +84,7 @@ abstract class BaseFragment<VM : BaseViewModel> : Fragment() {
             val tClass = tp as? Class<VM> ?: BaseViewModel::class.java
             viewModel = ViewModelProvider(viewModelStore, defaultViewModelProviderFactory)
                 .get(tClass) as VM
+            viewModel.context = context!!
         }
     }
 

+ 3 - 0
RMA/app/src/main/java/cn/muchinfo/rma/view/base/BaseViewModel.kt

@@ -1,6 +1,7 @@
 package cn.muchinfo.rma.view.base
 
 import android.app.Application
+import android.content.Context
 import androidx.lifecycle.AndroidViewModel
 import androidx.lifecycle.LifecycleObserver
 import androidx.lifecycle.viewModelScope
@@ -21,6 +22,8 @@ open class BaseViewModel(
     application: Application = Utils.getApp()
 ) : AndroidViewModel(application), LifecycleObserver {
 
+    lateinit var context: Context
+
     val defUI: UIChange by lazy { UIChange() }
 
     /**

+ 2 - 2
RMA/app/src/main/java/cn/muchinfo/rma/view/base/app/Constant.kt

@@ -9,9 +9,9 @@ object Constant {
     /**
      * 获取基础url的接口
      */
-//    const val baseurl = "http://103.40.249.127:28280/cfg?key=mtp_20"
+    const val baseurl = "http://103.40.249.127:28280/cfg?key=mtp_20"
 //    const val baseurl = "http://192.168.30.125:8080/cfg?key=test_125"
-    const val baseurl = "http://192.168.31.114:8080/cfg?key=test_114"
+//    const val baseurl = "http://192.168.31.114:8080/cfg?key=test_114"
 
     /**
      * 用sp存储基础url的key

+ 36 - 1
RMA/app/src/main/java/cn/muchinfo/rma/view/base/future/BaseFutureModel.kt

@@ -1,7 +1,15 @@
 package cn.muchinfo.rma.view.base.future
 
+import android.app.Activity
 import android.content.Context
 import android.graphics.drawable.ColorDrawable
+import androidx.annotation.NonNull
+import androidx.annotation.Nullable
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentActivity
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+import androidx.viewpager.widget.ViewPager
 import cn.muchinfo.rma.view.base.BaseViewModel
 import com.qmuiteam.qmui.util.QMUIDisplayHelper
 import com.qmuiteam.qmui.widget.tab.QMUITabBuilder
@@ -16,7 +24,7 @@ class BaseFutureModel: BaseViewModel() {
     /**
      * 解耦+统一布局样式
      */
-    fun qmuiTabSegmentConfig(idTab: QMUITabSegment?, context: Context): QMUITabBuilder? {
+    fun qmuiTabSegmentConfig(idTab: QMUITabSegment?, viewPager: ViewPager?, tabFragments: Array<Fragment>, tabs: Array<String?>, context: Context): QMUITabBuilder? {
 
         idTab?.setIndicator(QMUITabIndicator(QMUIDisplayHelper.dp2px(context, 2), false, true))
         val space: Int = QMUIDisplayHelper.dp2px(context, 10)
@@ -33,6 +41,33 @@ class BaseFutureModel: BaseViewModel() {
         setSelectedDrawable(ColorDrawable())?.
         setTextSize(size, size)?.
         setDynamicChangeIconColor(false)
+
+        //
+        var fManager: FragmentManager? = null
+        if (context is Fragment) {
+            fManager = context.childFragmentManager
+        } else if (context is FragmentActivity) {
+            fManager = context.supportFragmentManager
+        }
+        viewPager?.adapter = object : FragmentPagerAdapter(
+            fManager!!,
+            BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT
+        ) {
+            @NonNull
+            override fun getItem(position: Int): Fragment {
+                return tabFragments[position]
+            }
+
+            override fun getCount(): Int {
+                return tabFragments.size
+            }
+
+            @Nullable
+            override fun getPageTitle(position: Int): CharSequence? {
+                return tabs[position]
+            }
+        }
+        idTab?.setupWithViewPager(viewPager, false)
         return builder
     }
 }

+ 2 - 21
RMA/app/src/main/java/cn/muchinfo/rma/view/base/future/FutureFragment.kt

@@ -32,7 +32,7 @@ class FutureFragment : BaseFragment<FutureViewModel>() {
     private var idTab: QMUITabSegment? = null
     private var idPager: ViewPager? = null
     // tab 值
-    private val tabs = arrayOf(
+    private val tabs: Array<String?> = arrayOf(
         MyApplication.getInstance()?.resources?.getString(R.string.str_markets), // 行情
         MyApplication.getInstance()?.resources?.getString(R.string.str_holds), // 持仓
         MyApplication.getInstance()?.resources?.getString(R.string.str_entrusts), // 委托
@@ -64,32 +64,13 @@ class FutureFragment : BaseFragment<FutureViewModel>() {
         idPager = _view?.findViewById(R.id.id_pager)
 
         // 设置
-        val builder = BaseFutureModel().qmuiTabSegmentConfig(idTab, context!!)
+        val builder = BaseFutureModel().qmuiTabSegmentConfig(idTab, idPager, tabFragments, tabs, context!!)
 
         // 加载数据
         for (cat in tabs) {
             val item = builder?.setText(cat)?.build(context)
             idTab?.addTab(item)
         }
-        // 关联fragment
-        idPager?.adapter = object : FragmentPagerAdapter(
-            childFragmentManager,
-            BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
-            @NonNull
-            override fun getItem(position: Int): Fragment {
-                return tabFragments[position]
-            }
-
-            override fun getCount(): Int {
-                return tabFragments.size
-            }
-
-            @Nullable
-            override fun getPageTitle(position: Int): CharSequence? {
-                return tabs[position]
-            }
-        }
-        idTab?.setupWithViewPager(idPager, false)
         idTab?.addOnTabSelectedListener(object : QMUITabSegment.OnTabSelectedListener {
             /**
              * 当某个 Tab 被选中时会触发

+ 56 - 11
RMA/app/src/main/java/cn/muchinfo/rma/view/base/future/market/FutureMarket.kt

@@ -4,10 +4,13 @@ import android.os.Bundle
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import androidx.viewpager.widget.ViewPager
 import cn.muchinfo.rma.R
 import cn.muchinfo.rma.view.MyApplication
 import cn.muchinfo.rma.view.base.BaseFragment
-import com.google.android.material.tabs.TabLayout
+import cn.muchinfo.rma.view.base.future.BaseFutureModel
+import com.qmuiteam.qmui.widget.tab.QMUITabSegment
 
 /**
  * 期货的行情报价牌页面
@@ -17,15 +20,24 @@ class FutureMarket : BaseFragment<FutureMarketModel>() {
     companion object {
         fun getInstance() = FutureMarket()
     }
+
 //region views
     private var _view: View? = null
-    private var idFutureTab: TabLayout? = null
+    private var idMarketPager: ViewPager? = null
+    private var idFutureTab: QMUITabSegment? = null
 //endregion
 
-//region 数据
+    //region 数据
     // tab 值
     private val tabs = arrayOf(
-        MyApplication.getInstance()?.resources?.getString(R.string.str_choose) // 行情
+        MyApplication.getInstance()?.resources?.getString(R.string.str_choose)
+    )
+    // 页面,和对应的tab对应
+    private val tabFragments: Array<Fragment> = arrayOf(
+        MarketFragment.getInstance(),
+        MarketFragment.getInstance(),
+        MarketFragment.getInstance(),
+        MarketFragment.getInstance()
     )
 //endregion
 
@@ -41,14 +53,47 @@ class FutureMarket : BaseFragment<FutureMarketModel>() {
 
     private fun initViews() {
         idFutureTab = _view?.findViewById(R.id.id_future_tab)
+        idMarketPager = _view?.findViewById(R.id.id_market_pager)
+        tabs[1] = "主力"
+        tabs[2] = "上期所"
+        tabs[3] = "大商所"
+        tabs[4] = "郑商所"
+        tabs[5] = "上期能源"
+        tabs[6] = "下期再见"
+        // 设置
+        val builder = BaseFutureModel().qmuiTabSegmentConfig(idFutureTab, idMarketPager, tabFragments, tabs, context!!)
 
-        // tabs
-        for (element in tabs) {
-            val tab: TabLayout.Tab? = idFutureTab?.newTab()
-            tab?.text = element
-            if (tab != null) {
-                idFutureTab?.addTab(tab)
-            }
+        // 加载数据
+        for (cat in tabs) {
+            val item = builder?.setText(cat)?.build(context)
+            idFutureTab?.addTab(item)
         }
+        // 关联fragment
+        idFutureTab?.addOnTabSelectedListener(object : QMUITabSegment.OnTabSelectedListener {
+            /**
+             * 当某个 Tab 被选中时会触发
+             * @param index 被选中的 Tab 下标
+             */
+            override fun onTabSelected(index: Int) {
+            }
+
+            /**
+             * 当某个 Tab 被取消选中时会触发
+             * @param index 被取消选中的 Tab 下标
+             */
+            override fun onTabUnselected(index: Int) {}
+
+            /**
+             * 当某个 Tab 处于被选中状态下再次被点击时会触发
+             * @param index 被再次点击的 Tab 下标
+             */
+            override fun onTabReselected(index: Int) {
+            }
+            /**
+             * 当某个 Tab 被双击时会触发
+             * @param index 被双击的 Tab 下标
+             */
+            override fun onDoubleTap(index: Int) {}
+        })
     }
 }

+ 52 - 0
RMA/app/src/main/java/cn/muchinfo/rma/view/base/future/market/MarketBaseModel.kt

@@ -0,0 +1,52 @@
+package cn.muchinfo.rma.view.base.future.market
+
+import android.content.Context
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.TextView
+import androidx.recyclerview.widget.RecyclerView
+import cn.muchinfo.rma.R
+import cn.muchinfo.rma.view.base.BaseViewModel
+
+class MarketBaseModel : BaseViewModel() {
+    var list: ArrayList<MarketData>? = null
+    /**
+     * 获取配置器。
+     */
+    fun getAdapter(): RecyclerView.Adapter<MyAdapter.MarketHolder> {
+        return MyAdapter(context, list!!)
+    }
+
+    /**
+     * 通用的适配器。
+     */
+    class MyAdapter(context: Context, list: ArrayList<MarketData>) : RecyclerView.Adapter<MyAdapter.MarketHolder>() {
+        var list: ArrayList<MarketData>? = null
+        var inflater: LayoutInflater? = null
+        var context: Context? = null
+
+        init {
+            this.list = list
+            this.inflater = LayoutInflater.from(context)
+            this.context = context
+        }
+
+        override fun getItemCount(): Int {
+            return list?.size ?: 0
+        }
+
+        class MarketHolder(itemView: View?, context: Context) : RecyclerView.ViewHolder(itemView!!) {
+//            var text = itemView?.findViewById<TextView>(R.id.tv)
+        }
+
+        override fun onBindViewHolder(holder: MarketHolder, position: Int) {
+//            holder.text?.text = list?.get(position)?.goodsName
+        }
+
+        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MarketHolder {
+            return MarketHolder(inflater?.inflate(R.layout.market_item, parent, false), context!!)
+        }
+
+    }
+}

+ 34 - 0
RMA/app/src/main/java/cn/muchinfo/rma/view/base/future/market/MarketData.kt

@@ -0,0 +1,34 @@
+package cn.muchinfo.rma.view.base.future.market
+
+import java.io.Serializable
+
+/**
+ * 行情的item的中间件bo
+ */
+class MarketData: Serializable {
+    // 商品名称
+    var goodsName = ""
+        get() = field
+        set(value) {
+            field = value
+        }
+    // 商品代码
+    var goodsCode = ""
+        get() = field
+        set(value) {
+            field = value
+        }
+    // 商品id
+    var goodsId: Int = 0
+        get() = field
+        set(value) {
+            field = value
+        }
+    // 最新价格
+    var lastPrice: Double = 0.0
+        get() = field
+        set(value) {
+            field = value
+        }
+
+}

+ 42 - 0
RMA/app/src/main/java/cn/muchinfo/rma/view/base/future/market/MarketFragment.kt

@@ -0,0 +1,42 @@
+package cn.muchinfo.rma.view.base.future.market
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.recyclerview.widget.RecyclerView
+import cn.muchinfo.rma.R
+import cn.muchinfo.rma.view.base.BaseFragment
+
+/**
+ * 报价牌的通用fragment
+ */
+class MarketFragment: BaseFragment<MarketBaseModel>() {
+
+    companion object {
+        fun getInstance() = MarketFragment()
+    }
+//region views
+    private var _view: View? = null
+    private var idMarketList: RecyclerView? = null // 列表
+//endregion
+
+    override fun onCreateView(
+        inflater: LayoutInflater,
+        container: ViewGroup?,
+        savedInstanceState: Bundle?
+    ): View? {
+        _view = inflater.inflate(R.layout.market_fragment, container, false)
+        initViews()
+        return _view
+    }
+
+    private fun initViews() {
+        idMarketList = _view?.findViewById(R.id.id_market_list)
+        idMarketList?.adapter = viewModel.getAdapter()
+    }
+
+//region 函数
+
+//endregion
+}

+ 4 - 3
RMA/app/src/main/res/layout/future_market.xml

@@ -6,9 +6,9 @@
     xmlns:app="http://schemas.android.com/apk/res-auto">
 
     <!--    first tabs-->
-    <com.google.android.material.tabs.TabLayout
+    <com.qmuiteam.qmui.widget.tab.QMUITabSegment
         android:layout_width="match_parent"
-        android:layout_height="wrap_content"
+        android:layout_height="40dp"
         android:id="@+id/id_future_tab"
         app:layout_constraintTop_toTopOf="parent"
         app:tabMode="fixed"/>
@@ -20,8 +20,9 @@
         app:layout_constraintTop_toBottomOf="@+id/id_future_tab"
         layout="@layout/list_head"/>
 
-    <androidx.recyclerview.widget.RecyclerView
+    <androidx.viewpager.widget.ViewPager
         android:layout_width="match_parent"
+        android:id="@+id/id_market_pager"
         app:layout_constraintTop_toBottomOf="@+id/list_head"
         app:layout_constraintBottom_toBottomOf="parent"
         android:layout_height="0dp"/>

+ 14 - 0
RMA/app/src/main/res/layout/market_fragment.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:layout_width="match_parent"
+        app:layout_constraintTop_toTopOf="parent"
+        android:id="@+id/id_market_list"
+        android:layout_height="match_parent"/>
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 41 - 0
RMA/app/src/main/res/layout/market_item.xml

@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
+<!--可以点击的自选-->
+    <RelativeLayout
+        android:layout_width="wrap_content"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        android:paddingEnd="6dp"
+        android:paddingStart="1dp"
+        android:id="@+id/id_choose"
+        app:layout_constraintBottom_toBottomOf="parent"
+        android:layout_height="wrap_content">
+        <ImageView
+            android:layout_width="16dp"
+            android:src="@mipmap/rma_choose"
+            android:layout_marginTop="16dp"
+            android:layout_marginStart="10dp"
+            android:layout_height="16dp"/>
+    </RelativeLayout>
+<!--商品-->
+    <TextView
+        android:layout_width="wrap_content"
+        app:layout_constraintTop_toTopOf="parent"
+        android:text="铁矿石2105"
+        android:layout_marginTop="16dp"
+        android:id="@+id/id_goods_name"
+        app:layout_constraintStart_toEndOf="@+id/id_choose"
+        android:layout_height="wrap_content"/>
+<!--商品代码-->
+    <TextView
+        android:layout_width="wrap_content"
+        app:layout_constraintTop_toBottomOf="@+id/id_goods_name"
+        android:text="I2105"
+        android:id="@+id/id_goods_code"
+        app:layout_constraintStart_toEndOf="@+id/id_choose"
+        android:layout_height="wrap_content"/>
+
+</androidx.constraintlayout.widget.ConstraintLayout>

BIN
RMA/app/src/main/res/mipmap-hdpi/rma_choose.png