Просмотр исходного кода

Merge branch 'master' of http://git.wmzhubo.com/guadoutech/PartTimeJob_CN_Android

Administrator лет назад: 2
Родитель
Сommit
025f8f84bc
100 измененных файлов с 3508 добавлено и 472 удалено
  1. 1 0
      app/build.gradle
  2. 1 0
      cpt_ewallet/src/main/AndroidManifest.xml
  3. 14 0
      cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/bean/EWalletHistoryBean.java
  4. 128 0
      cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/mvvm/EWalletHistoryViewModel.kt
  5. 6 5
      cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/mvvm/EWalletMainViewModel.kt
  6. 180 0
      cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/ui/EWalletHistoryActivity.kt
  7. 35 2
      cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/ui/EWalletMainFragment.kt
  8. 123 0
      cpt_ewallet/src/main/res/layout/activity_ewallet_history.xml
  9. 10 5
      cpt_ewallet/src/main/res/layout/fragment_ewallet_main.xml
  10. 10 2
      cpt_ewallet/src/main/res/layout/item_ewallet_history.xml
  11. 36 0
      cpt_ewallet/src/main/res/layout/item_header_history_income.xml
  12. 14 0
      cpt_main/src/main/java/com/hongyegroup/cpt_main/mvvm/ProfileViewModel.kt
  13. 8 1
      cpt_main/src/main/java/com/hongyegroup/cpt_main/ui/HomeFragment.kt
  14. 26 66
      cpt_main/src/main/java/com/hongyegroup/cpt_main/ui/MainActivity.kt
  15. 68 0
      cpt_main/src/main/java/com/hongyegroup/cpt_main/ui/ProfileFragment.kt
  16. BIN
      cpt_main/src/main/res/drawable-xxhdpi/home_newsfeed_categroy.webp
  17. BIN
      cpt_main/src/main/res/drawable-xxhdpi/home_rewards_categroy.webp
  18. BIN
      cpt_main/src/main/res/drawable-xxhdpi/home_top_point.webp
  19. BIN
      cpt_main/src/main/res/drawable-xxhdpi/home_yyjobs_categroy.webp
  20. BIN
      cpt_main/src/main/res/drawable-xxhdpi/iv_part_time_activities_blue_icon.webp
  21. BIN
      cpt_main/src/main/res/drawable-xxhdpi/iv_part_time_activities_gray_icon.webp
  22. BIN
      cpt_main/src/main/res/drawable-xxhdpi/iv_part_time_jobs_blue_icon.webp
  23. BIN
      cpt_main/src/main/res/drawable-xxhdpi/iv_part_time_jobs_gray_icon.webp
  24. BIN
      cpt_main/src/main/res/drawable-xxhdpi/main_home_blue.png
  25. BIN
      cpt_main/src/main/res/drawable-xxhdpi/main_home_blue.webp
  26. BIN
      cpt_main/src/main/res/drawable-xxhdpi/main_home_gray.png
  27. BIN
      cpt_main/src/main/res/drawable-xxhdpi/main_home_gray.webp
  28. BIN
      cpt_main/src/main/res/drawable-xxhdpi/main_me_blue.png
  29. BIN
      cpt_main/src/main/res/drawable-xxhdpi/main_me_blue.webp
  30. BIN
      cpt_main/src/main/res/drawable-xxhdpi/main_me_gray.png
  31. BIN
      cpt_main/src/main/res/drawable-xxhdpi/main_me_gray.webp
  32. BIN
      cpt_main/src/main/res/drawable-xxhdpi/main_newsfeed_blue.webp
  33. BIN
      cpt_main/src/main/res/drawable-xxhdpi/main_newsfeed_gray.webp
  34. BIN
      cpt_main/src/main/res/drawable-xxhdpi/main_wallet_blue.webp
  35. BIN
      cpt_main/src/main/res/drawable-xxhdpi/main_wallet_gray.webp
  36. BIN
      cpt_main/src/main/res/drawable-xxhdpi/main_yypay_blue.png
  37. BIN
      cpt_main/src/main/res/drawable-xxhdpi/main_yypay_gray.png
  38. 0 11
      cpt_main/src/main/res/drawable/selector_main_tab_active.xml
  39. 11 0
      cpt_main/src/main/res/drawable/selector_main_tab_newsfeed.xml
  40. 0 11
      cpt_main/src/main/res/drawable/selector_main_tab_partjob.xml
  41. 6 6
      cpt_main/src/main/res/drawable/selector_main_tab_wallet.xml
  42. 28 82
      cpt_main/src/main/res/layout/activity_main.xml
  43. 205 81
      cpt_main/src/main/res/layout/fragment_home.xml
  44. 83 0
      cpt_main/src/main/res/layout/fragment_profile.xml
  45. 1 0
      cpt_newsfeed/.gitignore
  46. 6 0
      cpt_newsfeed/build.gradle
  47. 21 0
      cpt_newsfeed/proguard-rules.pro
  48. 26 0
      cpt_newsfeed/src/androidTest/java/com/hongyegroup/cpt_main/ExampleInstrumentedTest.java
  49. 17 0
      cpt_newsfeed/src/main/AndroidManifest.xml
  50. 30 0
      cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/adapter/NewsFeedListAdapter.kt
  51. 132 0
      cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/bean/NewsFeedAdatperBean.java
  52. 13 0
      cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/mvvm/NewsFeedDetailViewModel.kt
  53. 13 0
      cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/mvvm/NewsFeedFansViewModel.kt
  54. 13 0
      cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/mvvm/NewsFeedFollowViewModel.kt
  55. 98 0
      cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/mvvm/NewsFeedFollowingViewModel.kt
  56. 13 0
      cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/mvvm/NewsFeedFollowsViewModel.kt
  57. 16 0
      cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/mvvm/NewsFeedMainViewModel.kt
  58. 13 0
      cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/mvvm/NewsFeedMomentViewModel.kt
  59. 13 0
      cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/mvvm/NewsFeedPostViewModel.kt
  60. 13 0
      cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/mvvm/NewsFeedProfileViewModel.kt
  61. 24 0
      cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/router/NewsFeedComponentServiceImpl.kt
  62. 53 0
      cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/ui/NewsFeedDetailActivity.kt
  63. 44 0
      cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/ui/NewsFeedFansFragment.kt
  64. 42 0
      cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/ui/NewsFeedFollowFragment.kt
  65. 53 0
      cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/ui/NewsFeedFollowsActivity.kt
  66. 106 0
      cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/ui/NewsFeedListFragment.kt
  67. 154 0
      cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/ui/NewsFeedMainFragment.kt
  68. 59 0
      cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/ui/NewsFeedPostActivity.kt
  69. 50 0
      cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/ui/NewsFeedProfileActivity.kt
  70. 50 0
      cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/ui/NewsFeedProfileFragment.kt
  71. 39 0
      cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/widget/expand/ButtonSpan.java
  72. 279 0
      cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/widget/expand/ExpandTextView.java
  73. 25 0
      cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/widget/expand/InterceptUrlSpan.kt
  74. 43 0
      cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/widget/expand/MyTypefaceSpan.java
  75. BIN
      cpt_newsfeed/src/main/res/drawable-xxhdpi/news_feed_camera.webp
  76. BIN
      cpt_newsfeed/src/main/res/drawable-xxhdpi/news_feed_comments_un.webp
  77. BIN
      cpt_newsfeed/src/main/res/drawable-xxhdpi/news_feed_likes_un.webp
  78. BIN
      cpt_newsfeed/src/main/res/drawable-xxhdpi/news_feed_share_un.webp
  79. BIN
      cpt_newsfeed/src/main/res/drawable-xxhdpi/newsfeed_profile_news_addfollow_red.webp
  80. BIN
      cpt_newsfeed/src/main/res/drawable-xxhdpi/newsfeed_profile_news_followed.webp
  81. 5 0
      cpt_newsfeed/src/main/res/drawable/shape_news_feed_follow_red_round_18.xml
  82. 36 0
      cpt_newsfeed/src/main/res/layout/activity_newsfeed_detail.xml
  83. 36 0
      cpt_newsfeed/src/main/res/layout/activity_newsfeed_follows.xml
  84. 37 0
      cpt_newsfeed/src/main/res/layout/activity_newsfeed_post.xml
  85. 9 0
      cpt_newsfeed/src/main/res/layout/activity_newsfeed_profile.xml
  86. 34 0
      cpt_newsfeed/src/main/res/layout/fragment_newsfeed_fans.xml
  87. 34 0
      cpt_newsfeed/src/main/res/layout/fragment_newsfeed_follow.xml
  88. 37 0
      cpt_newsfeed/src/main/res/layout/fragment_newsfeed_following.xml
  89. 185 0
      cpt_newsfeed/src/main/res/layout/fragment_newsfeed_main.xml
  90. 34 0
      cpt_newsfeed/src/main/res/layout/fragment_newsfeed_profile.xml
  91. 239 0
      cpt_newsfeed/src/main/res/layout/item_news_feed_news.xml
  92. 347 0
      cpt_newsfeed/src/main/res/layout/layout_placeholder_newsfeed_hot.xml
  93. 17 0
      cpt_newsfeed/src/test/java/com/hongyegroup/cpt_main/ExampleUnitTest.java
  94. 5 3
      cpt_parttime/src/main/AndroidManifest.xml
  95. 0 54
      cpt_parttime/src/main/java/com/hongyegroup/cpt_parttime/adapter/PartTimeJobAdapter.kt
  96. 0 32
      cpt_parttime/src/main/java/com/hongyegroup/cpt_parttime/adapter/PopupPositionAdapter.kt
  97. 0 24
      cpt_parttime/src/main/java/com/hongyegroup/cpt_parttime/adapter/PopupTextAdapter.kt
  98. 0 69
      cpt_parttime/src/main/java/com/hongyegroup/cpt_parttime/adapter/PositionGridAdapter.java
  99. 1 18
      cpt_parttime/src/main/java/com/hongyegroup/cpt_parttime/bean/PartJobResult.java
  100. 0 0
      cpt_parttime/src/main/java/com/hongyegroup/cpt_parttime/mvvm/PartJobDetailChildViewModel.kt

+ 1 - 0
app/build.gradle

@@ -18,4 +18,5 @@ dependencies {
     implementation project(':cpt_parttime')
     implementation project(':cpt_ewallet')
     implementation project(':cpt_rewards')
+    implementation project(':cpt_newsfeed')
 }

+ 1 - 0
cpt_ewallet/src/main/AndroidManifest.xml

@@ -4,6 +4,7 @@
 
     <application android:allowBackup="true">
 
+        <activity android:name=".ui.EWalletHistoryActivity"/>
 
     </application>
 

+ 14 - 0
cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/bean/EWalletHistoryBean.java

@@ -0,0 +1,14 @@
+package com.hongyegroup.cpt_ewallet.bean;
+
+
+public class EWalletHistoryBean {
+
+    public String id;
+    public String title;
+    public String content;
+    public String date;
+
+    public String groupDate;
+    public boolean isShowDivider;
+
+}

+ 128 - 0
cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/mvvm/EWalletHistoryViewModel.kt

@@ -0,0 +1,128 @@
+package com.hongyegroup.cpt_ewallet.mvvm
+
+import android.annotation.SuppressLint
+import android.view.View
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.SavedStateHandle
+import com.guadou.cs_cptservices.binding.BaseDataBindingAdapter
+import com.guadou.lib_baselib.base.vm.BaseViewModel
+import com.guadou.lib_baselib.ext.checkEmpty
+import com.guadou.lib_baselib.utils.CommUtils
+import com.hongyegroup.cpt_ewallet.BR
+import com.hongyegroup.cpt_ewallet.R
+import com.hongyegroup.cpt_ewallet.bean.EWalletHistoryBean
+import dagger.hilt.android.lifecycle.HiltViewModel
+import kotlinx.coroutines.delay
+import javax.inject.Inject
+
+@HiltViewModel
+class EWalletHistoryViewModel @Inject constructor(
+    private val savedStateHandle: SavedStateHandle
+) : BaseViewModel() {
+
+    var mKeywordLiveData = MutableLiveData<String>()
+
+    var mCurPage = 1
+    private var isNeedPlaceHolder = true
+    var isNeedCleanAllData = true
+    var mHistoryDatas = mutableListOf<EWalletHistoryBean>()
+    val mAdapter by lazy { BaseDataBindingAdapter(R.layout.item_ewallet_history, BR.item, mHistoryDatas) }
+
+
+    fun getHistoryList(): LiveData<Boolean> {
+        val liveData = MutableLiveData<Boolean>()
+
+        launchOnUI {
+            //开始Loading
+            if (isNeedPlaceHolder) loadStartLoading()
+
+            delay(1500)
+            val list = mutableListOf<EWalletHistoryBean>()
+            for (i in 1..10) {
+                list.add(EWalletHistoryBean().apply {
+                    groupDate = "2022-07-0$mCurPage"
+                })
+            }
+
+            handleData(list)
+            loadSuccess()
+            liveData.postValue(true)
+
+            //返回的数据是封装过的,检查是否成功
+//            result.checkResult({
+//                loadSuccess()
+//                //成功
+//                handleData(it?.list)
+//                liveData.postValue(true)
+//            }, {
+//                //失败
+//                if (isNeedPlaceHolder) {
+//                    loadError(it)
+//                } else {
+//                    toast(it)
+//                }
+//                liveData.postValue(false)
+//            })
+        }
+
+        return liveData
+    }
+
+    //处理数据-添加或刷新
+    @SuppressLint("SetTextI18n", "NotifyDataSetChanged")
+    private fun handleData(list: List<EWalletHistoryBean>?) {
+        if (!list.checkEmpty()) {
+            //有数据,判断是刷新还是加载更多的数据
+            if (isNeedCleanAllData) {
+                //刷新的方式
+                mHistoryDatas.clear()
+                addAllHistoryBean(list!!)
+                mAdapter.notifyDataSetChanged()
+            } else {
+                //加载更多
+                addAllHistoryBean(list!!)
+//                mAdapter.notifyItemRangeInserted((mHistoryDatas.size - list.size , list.size )
+//                mAdapter.notifyItemRangeChanged(mHistoryDatas.size - list.size - 1, list.size + 1)
+                mAdapter.notifyDataSetChanged()
+                mAdapter.loadMoreModule.loadMoreComplete()
+            }
+        } else {
+            //展示无数据
+            if (isNeedCleanAllData && mCurPage == 1) {
+                mHistoryDatas.clear()
+                mAdapter.notifyDataSetChanged()
+                //展示无数据的布局
+                val emptyView: View = CommUtils.inflate(R.layout.item_empty_layout)
+                mAdapter.setEmptyView(emptyView)
+            } else {
+                //如果是加载更多,展示加载完成,没有更多数据了
+                mAdapter.loadMoreModule.loadMoreEnd()
+            }
+        }
+        isNeedPlaceHolder = false
+        isNeedCleanAllData = false
+    }
+
+    //赋值并判断月份的分割线字段
+    private fun addAllHistoryBean(list: List<EWalletHistoryBean>) {
+        mHistoryDatas.addAll(list)
+
+        if (mHistoryDatas.size == 1) {
+            mHistoryDatas[0].isShowDivider = false
+        } else {
+            mHistoryDatas.last().isShowDivider = false
+
+            mHistoryDatas.forEachIndexed { index, bean ->
+                if (index > 0) {
+                    val preBean = mHistoryDatas[index - 1]
+                    preBean.isShowDivider = bean.groupDate != preBean.groupDate
+                }
+            }
+
+        }
+
+
+    }
+
+}

+ 6 - 5
cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/mvvm/EWalletMainViewModel.kt

@@ -4,8 +4,9 @@ import android.annotation.SuppressLint
 import androidx.lifecycle.SavedStateHandle
 import com.guadou.cs_cptservices.binding.BaseDataBindingAdapter
 import com.guadou.lib_baselib.base.vm.BaseViewModel
-import com.hongyegroup.cpt_ewallet.R
 import com.hongyegroup.cpt_ewallet.BR
+import com.hongyegroup.cpt_ewallet.R
+import com.hongyegroup.cpt_ewallet.bean.EWalletHistoryBean
 import dagger.hilt.android.lifecycle.HiltViewModel
 import javax.inject.Inject
 
@@ -14,16 +15,16 @@ class EWalletMainViewModel @Inject constructor(
     private val savedStateHandle: SavedStateHandle
 ) : BaseViewModel() {
 
-    var mHistoryDatas = mutableListOf<String>()
+    var mHistoryDatas = mutableListOf<EWalletHistoryBean>()
     val mAdapter by lazy { BaseDataBindingAdapter(R.layout.item_ewallet_history, BR.item, mHistoryDatas) }
 
 
     @SuppressLint("NotifyDataSetChanged")
     fun setupDataes() {
         mHistoryDatas.clear()
-        mHistoryDatas.add("1")
-        mHistoryDatas.add("1")
-        mHistoryDatas.add("1")
+        mHistoryDatas.add(EWalletHistoryBean())
+        mHistoryDatas.add(EWalletHistoryBean())
+        mHistoryDatas.add(EWalletHistoryBean())
 
         mAdapter.notifyDataSetChanged()
     }

+ 180 - 0
cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/ui/EWalletHistoryActivity.kt

@@ -0,0 +1,180 @@
+package com.hongyegroup.cpt_ewallet.ui
+
+import android.graphics.Color
+import android.os.Bundle
+import android.view.View
+import android.widget.TextView
+import com.chad.library.adapter.base.listener.OnLoadMoreListener
+import com.gavin.com.library.PowerfulStickyDecoration
+import com.gavin.com.library.listener.PowerGroupListener
+import com.guadou.cs_cptservices.base.activity.YYBaseVDBLoadingActivity
+import com.guadou.lib_baselib.bean.DataBindingConfig
+import com.guadou.lib_baselib.engine.toast
+import com.guadou.lib_baselib.ext.commContext
+import com.guadou.lib_baselib.ext.dp2px
+import com.guadou.lib_baselib.ext.gotoActivity
+import com.guadou.lib_baselib.ext.vertical
+import com.guadou.lib_baselib.utils.KeyboardUtils
+import com.guadou.lib_baselib.view.gloading.GLoadingTitleStatus
+import com.guadou.lib_baselib.view.gloading.Gloading
+import com.guadou.lib_baselib.view.gloading.GloadingPlaceHolderlAdapter
+import com.hongyegroup.cpt_ewallet.BR
+import com.hongyegroup.cpt_ewallet.R
+import com.hongyegroup.cpt_ewallet.databinding.ActivityEwalletHistoryBinding
+import com.hongyegroup.cpt_ewallet.mvvm.EWalletHistoryViewModel
+import com.scwang.smart.refresh.layout.api.RefreshLayout
+import com.scwang.smart.refresh.layout.listener.OnRefreshListener
+
+/**
+ * 电子钱包的历史记录列表
+ */
+class EWalletHistoryActivity : YYBaseVDBLoadingActivity<EWalletHistoryViewModel, ActivityEwalletHistoryBinding>(), OnLoadMoreListener,
+    OnRefreshListener {
+
+    private var mTopDecoration: PowerfulStickyDecoration? = null
+    private val clickProxy by lazy { ClickProxy() }
+
+    companion object {
+        fun startInstance() {
+            commContext().gotoActivity<EWalletHistoryActivity>()
+        }
+    }
+
+    override fun getDataBindingConfig(): DataBindingConfig {
+        return DataBindingConfig(R.layout.activity_ewallet_history, BR.viewModel, mViewModel)
+            .addBindingParams(BR.click, clickProxy)
+    }
+
+    //重新生成GLoading对象
+    override fun generateGLoading(): Gloading.Holder {
+        return Gloading.from(GloadingPlaceHolderlAdapter(R.layout.layout_placeholder_normal))
+            .wrap(this, GLoadingTitleStatus(true, true, false))
+            .withRetry {
+                initData()
+            }
+    }
+
+    override fun startObserve() {
+
+    }
+
+    override fun init(savedInstanceState: Bundle?) {
+        initRV()
+        initData()
+        initListener()
+    }
+
+    private fun initData() {
+        mViewModel.getHistoryList().observe(this) {
+            mBinding.refreshLayout.finishRefresh()
+            mViewModel.mAdapter.loadMoreModule.isEnableLoadMore = true
+        }
+    }
+
+    private fun initRV() {
+        //悬停头的定义
+        val listener: PowerGroupListener = object : PowerGroupListener {
+            override fun getGroupName(position: Int): String? {
+                //获取组名,用于判断是否是同一组
+                return if (mViewModel.mHistoryDatas.size > position) {
+                    mViewModel.mHistoryDatas[position].groupDate
+                } else null
+            }
+
+            override fun getGroupView(position: Int): View {
+                //获取自定定义的组View
+                return if (mViewModel.mHistoryDatas.size > position) {
+                    layoutInflater.inflate(R.layout.item_header_history_income, null, false).apply {
+                        findViewById<TextView>(R.id.tv_head_job_date).text = mViewModel.mHistoryDatas[position].groupDate
+                    }
+                } else {
+                    View(mActivity).apply { setBackgroundColor(Color.WHITE) }
+                }
+            }
+        }
+        mTopDecoration = PowerfulStickyDecoration.Builder
+            .init(listener)
+            .setGroupHeight(dp2px(40f))
+            .setCacheEnable(true)
+            .setHeaderCount(0) //是否有头布局->头布局的数量
+            .setOnClickListener { _, _ -> //Head点击事件
+                toast("去查看当月收入支出账单")
+            }
+            .build()
+
+        mBinding.recyclerView.vertical().apply {
+            addItemDecoration(mTopDecoration!!)
+            adapter = mViewModel.mAdapter
+
+        }
+    }
+
+    private fun initListener() {
+        //Adapter的滑动监听,监听加载更多
+        mViewModel.mAdapter.loadMoreModule.isEnableLoadMore = false
+        mViewModel.mAdapter.loadMoreModule.preLoadNumber = 4
+        mViewModel.mAdapter.loadMoreModule.setOnLoadMoreListener(this)
+
+        //刷新控件初始化
+        mBinding.refreshLayout.setEnableNestedScroll(true)
+        mBinding.refreshLayout.setEnableLoadMore(false)
+        mBinding.refreshLayout.setEnableRefresh(true)
+        mBinding.refreshLayout.setOnRefreshListener(this)
+
+        //Item点击
+        mViewModel.mAdapter.setOnItemClickListener { _, _, position ->
+            val item = mViewModel.mHistoryDatas[position]
+            clickProxy.gotoHistoryDetailPage()
+        }
+    }
+
+    override fun onRefresh(refreshLayout: RefreshLayout) {
+        mTopDecoration?.clearCache()
+
+        mViewModel.isNeedCleanAllData = true
+        mViewModel.mAdapter.loadMoreModule.loadMoreComplete()
+        mViewModel.mAdapter.loadMoreModule.isEnableLoadMore = false
+        //直接调用,参数从成员变量中获取
+        mViewModel.mCurPage = 1
+        initData()
+    }
+
+    override fun onLoadMore() {
+        mViewModel.isNeedCleanAllData = false
+        mViewModel.mCurPage++
+        initData()
+    }
+
+    /**
+     * DataBinding事件处理
+     */
+    inner class ClickProxy {
+
+        fun backPage() {
+            finish()
+        }
+
+        //执行搜索
+        fun doSearch() {
+            KeyboardUtils.hideSoftInput(mActivity)
+            mBinding.refreshLayout.autoRefresh()
+        }
+
+        //搜索的删除
+        fun searchDel() {
+            mViewModel.mKeywordLiveData.value = ""
+            doSearch()
+        }
+
+        //根据时间搜索
+        fun searchByData() {
+            toast("去新页面筛选时间")
+        }
+
+        //去历史详情页面
+        fun gotoHistoryDetailPage() {
+            toast("去历史详情页面")
+        }
+
+    }
+}

+ 35 - 2
cpt_ewallet/src/main/java/com/hongyegroup/cpt_ewallet/ui/EWalletMainFragment.kt

@@ -21,9 +21,11 @@ import com.scwang.smart.refresh.layout.listener.OnRefreshListener
 class EWalletMainFragment : YYBaseVDBFragment<EWalletMainViewModel, FragmentEwalletMainBinding>(), IFragmentRefresh,
     OnRefreshListener {
 
+    private val clickProxy by lazy { ClickProxy() }
+
     override fun getDataBindingConfig(): DataBindingConfig {
         return DataBindingConfig(R.layout.fragment_ewallet_main, BR.viewModel, mViewModel)
-            .addBindingParams(BR.click, ClickProxy())
+            .addBindingParams(BR.click, clickProxy)
     }
 
     override fun startObserve() {
@@ -74,7 +76,7 @@ class EWalletMainFragment : YYBaseVDBFragment<EWalletMainViewModel, FragmentEwal
         mBinding.refreshLayout.setOnRefreshListener(this)
 
         mViewModel.mAdapter.setOnItemClickListener { adapter, view, position ->
-            toast("点击进入发票详情")
+            clickProxy.gotoHistoryDetailPage()
         }
     }
 
@@ -88,6 +90,37 @@ class EWalletMainFragment : YYBaseVDBFragment<EWalletMainViewModel, FragmentEwal
      */
     inner class ClickProxy {
 
+        //去历史页面
+        fun gotoEWalletHistoryPage() {
+            EWalletHistoryActivity.startInstance()
+        }
+
+        //去历史详情页面
+        fun gotoHistoryDetailPage() {
+            toast("去历史详情页面")
+        }
+
+        //去年度报表发票页面
+        fun gotoEWalletInviocePage() {
+            toast("去年度报表发票页面")
+        }
+
+        //去设置密码页面
+        fun gotoSetPsdPage() {
+            toast("去设置密码页面")
+        }
+
+        //去提现页面
+        fun gotoWithdrawalPage() {
+            toast("去提现页面")
+        }
+
+        //去提现预约页面
+        fun gotoAppointmentPage() {
+            toast("去提现预约页面")
+        }
+
+
     }
 
 }

+ 123 - 0
cpt_ewallet/src/main/res/layout/activity_ewallet_history.xml

@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:binding="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools">
+
+    <data>
+
+        <variable
+            name="viewModel"
+            type="com.hongyegroup.cpt_ewallet.mvvm.EWalletHistoryViewModel" />
+
+        <variable
+            name="click"
+            type="com.hongyegroup.cpt_ewallet.ui.EWalletHistoryActivity.ClickProxy" />
+
+        <import type="android.text.TextUtils" />
+    </data>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="@color/white"
+        android:focusable="true"
+        android:focusableInTouchMode="true"
+        android:orientation="vertical">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_46dp"
+            android:gravity="center_vertical"
+            android:orientation="horizontal"
+            android:paddingLeft="@dimen/d_15dp"
+            android:paddingRight="@dimen/d_15dp">
+
+            <ImageView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="1.5dp"
+                android:src="@mipmap/iv_blue_back"
+                binding:clicks="@{click.backPage}" />
+
+            <LinearLayout
+                android:layout_width="0dp"
+                android:layout_height="32dp"
+                android:layout_marginLeft="@dimen/d_15dp"
+                android:layout_weight="1"
+                android:background="@drawable/shape_search_gray_bg_corners3"
+                android:gravity="center_vertical"
+                android:orientation="horizontal">
+
+                <ImageView
+                    android:layout_width="@dimen/d_16dp"
+                    android:layout_height="@dimen/d_16dp"
+                    android:layout_marginLeft="@dimen/d_12dp"
+                    android:src="@drawable/search_icon"
+                    binding:clicks="@{click.doSearch}" />
+
+                <EditText
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="@dimen/d_12dp"
+                    android:layout_weight="1"
+                    android:background="@color/transparent"
+                    android:hint="大家都在搜"
+                    android:imeOptions="actionSearch"
+                    android:singleLine="true"
+                    android:text="@={viewModel.mKeywordLiveData}"
+                    android:textColor="@color/black"
+                    android:textColorHint="@color/gray_99"
+                    android:textSize="@dimen/d_14sp"
+                    binding:onKeyEnter="@{click.doSearch}"
+                    binding:typefaceMedium="@{true}" />
+
+                <ImageView
+                    android:layout_width="@dimen/d_16dp"
+                    android:layout_height="@dimen/d_16dp"
+                    android:layout_marginRight="@dimen/d_10dp"
+                    android:src="@drawable/search_delete"
+                    android:visibility="gone"
+                    binding:clicks="@{click.searchDel}"
+                    binding:isVisibleGone="@{!TextUtils.isEmpty(viewModel.MKeywordLiveData)}" />
+
+            </LinearLayout>
+
+            <ImageView
+                android:layout_width="21.5dp"
+                android:layout_height="20.5dp"
+                android:layout_marginLeft="@dimen/d_12dp"
+                android:src="@drawable/history_title_red_calendar_icon"
+                binding:clicks="@{click.searchByData}" />
+
+        </LinearLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_0.7dp"
+            android:background="@color/main_divider" />
+
+        <com.scwang.smart.refresh.layout.SmartRefreshLayout
+            android:id="@+id/refresh_layout"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            app:srlEnablePreviewInEditMode="false"
+            app:srlPrimaryColor="@color/white">
+
+            <com.scwang.smart.refresh.header.ClassicsHeader
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content" />
+
+            <com.guadou.cs_cptservices.widget.MyStickRecyclerView
+                android:id="@+id/recycler_view"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:overScrollMode="never"
+                android:scrollbars="none" />
+
+        </com.scwang.smart.refresh.layout.SmartRefreshLayout>
+
+
+    </LinearLayout>
+
+</layout>

+ 10 - 5
cpt_ewallet/src/main/res/layout/fragment_ewallet_main.xml

@@ -183,7 +183,8 @@
                             android:layout_height="wrap_content"
                             android:layout_weight="1"
                             android:gravity="center"
-                            android:orientation="vertical">
+                            android:orientation="vertical"
+                            binding:clicks="@{click.gotoWithdrawalPage}">
 
                             <ImageView
                                 android:layout_width="@dimen/d_35dp"
@@ -213,7 +214,8 @@
                             android:layout_height="wrap_content"
                             android:layout_weight="1"
                             android:gravity="center"
-                            android:orientation="vertical">
+                            android:orientation="vertical"
+                            binding:clicks="@{click.gotoAppointmentPage}">
 
                             <ImageView
                                 android:layout_width="@dimen/d_35dp"
@@ -246,7 +248,8 @@
                         android:gravity="center_vertical"
                         android:orientation="horizontal"
                         android:paddingLeft="@dimen/d_18dp"
-                        android:paddingRight="@dimen/d_18dp">
+                        android:paddingRight="@dimen/d_18dp"
+                        binding:clicks="@{click.gotoSetPsdPage}">
 
                         <ImageView
                             android:layout_width="@dimen/d_26dp"
@@ -288,7 +291,8 @@
                         android:gravity="center_vertical"
                         android:orientation="horizontal"
                         android:paddingLeft="@dimen/d_18dp"
-                        android:paddingRight="@dimen/d_18dp">
+                        android:paddingRight="@dimen/d_18dp"
+                        binding:clicks="@{click.gotoEWalletHistoryPage}">
 
                         <ImageView
                             android:layout_width="@dimen/d_25dp"
@@ -329,7 +333,8 @@
                         android:gravity="center_vertical"
                         android:orientation="horizontal"
                         android:paddingLeft="@dimen/d_18dp"
-                        android:paddingRight="@dimen/d_18dp">
+                        android:paddingRight="@dimen/d_18dp"
+                        binding:clicks="@{click.gotoEWalletInviocePage}">
 
                         <ImageView
                             android:layout_width="@dimen/d_25dp"

+ 10 - 2
cpt_ewallet/src/main/res/layout/item_ewallet_history.xml

@@ -8,7 +8,7 @@
 
         <variable
             name="item"
-            type="String" />
+            type="com.hongyegroup.cpt_ewallet.bean.EWalletHistoryBean" />
 
         <import type="android.text.TextUtils" />
 
@@ -74,12 +74,20 @@
 
         </RelativeLayout>
 
-
         <View
             android:layout_width="match_parent"
             android:layout_height="@dimen/d_0.7dp"
             android:background="@color/page_bg" />
 
+        <View
+            android:id="@+id/view_date_divider"
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_10dp"
+            android:background="@color/page_bg"
+            android:visibility="gone"
+            binding:isVisibleGone="@{item.isShowDivider}"
+            tools:visibility="visible" />
+
     </LinearLayout>
 
 </layout>

+ 36 - 0
cpt_ewallet/src/main/res/layout/item_header_history_income.xml

@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="@dimen/d_40dp"
+    android:background="@color/white"
+    android:gravity="center_vertical"
+    android:orientation="horizontal"
+    android:paddingLeft="@dimen/d_15dp"
+    android:paddingRight="@dimen/d_15dp">
+
+    <com.guadou.lib_baselib.font_text_view.TextViewMedium
+        android:id="@+id/tv_head_job_date"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_weight="1"
+        android:text="2022年6月"
+        android:textColor="@color/notify_dark_blue"
+        android:textSize="@dimen/d_18sp" />
+
+    <com.guadou.lib_baselib.font_text_view.TextViewMedium
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="收入:"
+        android:textColor="@color/gray_76"
+        android:textSize="@dimen/d_15sp" />
+
+    <com.guadou.lib_baselib.font_text_view.TextViewMedium
+        android:id="@+id/tv_income"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="65.93"
+        android:textColor="@color/notify_dark_blue"
+        android:textSize="@dimen/d_15sp" />
+
+</LinearLayout>
+

+ 14 - 0
cpt_main/src/main/java/com/hongyegroup/cpt_main/mvvm/ProfileViewModel.kt

@@ -0,0 +1,14 @@
+package com.hongyegroup.cpt_main.mvvm
+
+import androidx.lifecycle.SavedStateHandle
+import com.guadou.lib_baselib.base.vm.BaseViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import javax.inject.Inject
+
+@HiltViewModel
+class ProfileViewModel @Inject constructor(
+    private val savedStateHandle: SavedStateHandle
+) : BaseViewModel() {
+
+
+}

+ 8 - 1
cpt_main/src/main/java/com/hongyegroup/cpt_main/ui/HomeFragment.kt

@@ -143,8 +143,15 @@ class HomeFragment : YYBaseVDBLoadingFragment<HomeViewModel, FragmentHomeBinding
 
         }
 
+        //切换到NewsFeed-Tab
+        fun gotoNewsFeedTab() {
+            if (requireActivity() is MainActivity) {
+                (requireActivity() as MainActivity).switchFragment(2)
+            }
+        }
+
         fun gotoParttimePage() {
-            toast("去兼职页面")
+            YYRouterService.parttimeComponentServer?.startPartTimeJobMainPage()
         }
 
         fun gotoBulletinBoardPage() {

+ 26 - 66
cpt_main/src/main/java/com/hongyegroup/cpt_main/ui/MainActivity.kt

@@ -21,7 +21,7 @@ import com.hongyegroup.cpt_main.mvvm.MainViewModel
 import dagger.hilt.android.AndroidEntryPoint
 
 /**
- * 首页Tab+Fragment
+ * 首页Tab + Fragment
  */
 @Route(path = ARouterPath.PATH_MAIN_PAGE_MAIN)
 @AndroidEntryPoint
@@ -29,9 +29,8 @@ class MainActivity : YYBaseVDBActivity<MainViewModel, ActivityMainBinding>() {
 
     //首页的5个TabFragment
     private var mHomeFragment: Fragment? = null
-    private var mPartTimeFragment: Fragment? = null
-    private var mActivesFragment: Fragment? = null
     private var mEWalletFragment: Fragment? = null
+    private var mNewsFeedFragment: Fragment? = null
     private var mProfileFragment: Fragment? = null
     private var mCurPosition = 0  //当前Fragment选中的索引
     private var mClickPage = 0  //当前Fragment选中的索引
@@ -80,21 +79,16 @@ class MainActivity : YYBaseVDBActivity<MainViewModel, ActivityMainBinding>() {
                     }
                 }
                 1 -> {
-                    mPartTimeFragment?.let {
+                    mEWalletFragment?.let {
                         if (it is IFragmentRefresh) (it as IFragmentRefresh).scrollTopRefresh()
                     }
                 }
                 2 -> {
-                    mActivesFragment?.let {
+                    mNewsFeedFragment?.let {
                         if (it is IFragmentRefresh) (it as IFragmentRefresh).scrollTopRefresh()
                     }
                 }
                 3 -> {
-                    mEWalletFragment?.let {
-                        if (it is IFragmentRefresh) (it as IFragmentRefresh).scrollTopRefresh()
-                    }
-                }
-                4 -> {
                     mProfileFragment?.let {
                         if (it is IFragmentRefresh) (it as IFragmentRefresh).scrollTopRefresh()
                     }
@@ -106,7 +100,7 @@ class MainActivity : YYBaseVDBActivity<MainViewModel, ActivityMainBinding>() {
     // ============================  Fragment begin ↓  =============================
 
     //切换索引
-    private fun switchFragment(index: Int) {
+    fun switchFragment(index: Int) {
         val targetFragment: Fragment?
         val targetTag = index.toString()
 
@@ -115,15 +109,12 @@ class MainActivity : YYBaseVDBActivity<MainViewModel, ActivityMainBinding>() {
                 targetFragment = mHomeFragment
             }
             1 -> {
-                targetFragment = mPartTimeFragment
+                targetFragment = mEWalletFragment
             }
             2 -> {
-                targetFragment = mActivesFragment
+                targetFragment = mNewsFeedFragment
             }
             3 -> {
-                targetFragment = mEWalletFragment
-            }
-            4 -> {
                 targetFragment = mProfileFragment
             }
             else -> {
@@ -158,7 +149,7 @@ class MainActivity : YYBaseVDBActivity<MainViewModel, ActivityMainBinding>() {
     private fun setupStatusBarColor() {
         //只有Profile页面变白色
         when (mCurPosition) {
-            2, 3, 4 -> setStatusBarWhiteText()
+            1, 3 -> setStatusBarWhiteText()
             else -> setStatusBarBlackText()
         }
     }
@@ -168,13 +159,10 @@ class MainActivity : YYBaseVDBActivity<MainViewModel, ActivityMainBinding>() {
         mHomeFragment?.let {
             transaction.hide(it)
         }
-        mPartTimeFragment?.let {
-            transaction.hide(it)
-        }
-        mActivesFragment?.let {
+        mEWalletFragment?.let {
             transaction.hide(it)
         }
-        mEWalletFragment?.let {
+        mNewsFeedFragment?.let {
             transaction.hide(it)
         }
         mProfileFragment?.let {
@@ -184,43 +172,31 @@ class MainActivity : YYBaseVDBActivity<MainViewModel, ActivityMainBinding>() {
 
     //底部Tab的选中效果
     private fun setBottomSelected(position: Int) {
-        mBinding.groupTabParttime.isSelected = false
 
         //传递进来的Position设置为选中:
         when (position) {
             0 -> {
                 mBinding.groupTabHome.isSelected = true
-                mBinding.groupTabParttime.isSelected = false
-                mBinding.groupTabActives.isSelected = false
                 mBinding.groupTabWallet.isSelected = false
+                mBinding.groupTabNewsfeed.isSelected = false
                 mBinding.groupTabMe.isSelected = false
             }
             1 -> {
                 mBinding.groupTabHome.isSelected = false
-                mBinding.groupTabParttime.isSelected = true
-                mBinding.groupTabActives.isSelected = false
-                mBinding.groupTabWallet.isSelected = false
+                mBinding.groupTabWallet.isSelected = true
+                mBinding.groupTabNewsfeed.isSelected = false
                 mBinding.groupTabMe.isSelected = false
             }
             2 -> {
                 mBinding.groupTabHome.isSelected = false
-                mBinding.groupTabParttime.isSelected = false
-                mBinding.groupTabActives.isSelected = true
                 mBinding.groupTabWallet.isSelected = false
+                mBinding.groupTabNewsfeed.isSelected = true
                 mBinding.groupTabMe.isSelected = false
             }
             3 -> {
                 mBinding.groupTabHome.isSelected = false
-                mBinding.groupTabParttime.isSelected = false
-                mBinding.groupTabActives.isSelected = false
-                mBinding.groupTabWallet.isSelected = true
-                mBinding.groupTabMe.isSelected = false
-            }
-            else -> {
-                mBinding.groupTabHome.isSelected = false
-                mBinding.groupTabParttime.isSelected = false
-                mBinding.groupTabActives.isSelected = false
                 mBinding.groupTabWallet.isSelected = false
+                mBinding.groupTabNewsfeed.isSelected = false
                 mBinding.groupTabMe.isSelected = true
             }
         }
@@ -232,10 +208,9 @@ class MainActivity : YYBaseVDBActivity<MainViewModel, ActivityMainBinding>() {
     private fun initFragment() {
         // 正常情况下初始化
         mHomeFragment = HomeFragment()
-        mPartTimeFragment = YYRouterService.parttimeComponentServer?.obtainPartTimeMainFragment()
-        mActivesFragment = YYRouterService.parttimeComponentServer?.obtainPartTimeActivesFragment()
         mEWalletFragment = YYRouterService.eWalletComponentServer?.obtainEWalletMainFragment()
-        mProfileFragment = YYRouterService.parttimeComponentServer?.obtainPartTimeProfileFragment()
+        mNewsFeedFragment = YYRouterService.newsfeedComponentServer?.obtainNewsFeedMainFragment()
+        mProfileFragment = ProfileFragment()
     }
 
     // activity的销毁标识
@@ -254,14 +229,12 @@ class MainActivity : YYBaseVDBActivity<MainViewModel, ActivityMainBinding>() {
             val f1 = manager.findFragmentByTag("1")
             val f2 = manager.findFragmentByTag("2")
             val f3 = manager.findFragmentByTag("3")
-            val f4 = manager.findFragmentByTag("4")
 
             // 复用
             mHomeFragment = f0 ?: HomeFragment()
-            mPartTimeFragment = f1 ?: YYRouterService.parttimeComponentServer?.obtainPartTimeMainFragment()
-            mActivesFragment = f2 ?: YYRouterService.parttimeComponentServer?.obtainPartTimeActivesFragment()
-            mEWalletFragment = f3 ?: YYRouterService.eWalletComponentServer?.obtainEWalletMainFragment()
-            mProfileFragment = f4 ?: YYRouterService.parttimeComponentServer?.obtainPartTimeProfileFragment()
+            mEWalletFragment = f1 ?: YYRouterService.eWalletComponentServer?.obtainEWalletMainFragment()
+            mNewsFeedFragment = f2 ?: YYRouterService.newsfeedComponentServer?.obtainNewsFeedMainFragment()
+            mProfileFragment = f3 ?: ProfileFragment()
         }
     }
 
@@ -291,11 +264,11 @@ class MainActivity : YYBaseVDBActivity<MainViewModel, ActivityMainBinding>() {
             }
         }
 
-        fun switchPartTime() {
+        fun switchEWallet() {
             mClickPage = 1
             if (mClickPage == mCurPosition) {
                 //重复点击
-                mPartTimeFragment?.let {
+                mEWalletFragment?.let {
                     if (it is IFragmentRefresh) (it as IFragmentRefresh).scrollTopRefresh()
                 }
             } else {
@@ -303,11 +276,11 @@ class MainActivity : YYBaseVDBActivity<MainViewModel, ActivityMainBinding>() {
             }
         }
 
-        fun switchActives() {
+        fun switchNewsFeed() {
             mClickPage = 2
             if (mClickPage == mCurPosition) {
                 //重复点击
-                mActivesFragment?.let {
+                mNewsFeedFragment?.let {
                     if (it is IFragmentRefresh) (it as IFragmentRefresh).scrollTopRefresh()
                 }
             } else {
@@ -315,29 +288,16 @@ class MainActivity : YYBaseVDBActivity<MainViewModel, ActivityMainBinding>() {
             }
         }
 
-        //切换消息页面Tab
-        fun switchEWallet() {
-            mClickPage = 3
-            if (mClickPage == mCurPosition) {
-                //重复点击
-                mEWalletFragment?.let {
-                    if (it is IFragmentRefresh) (it as IFragmentRefresh).scrollTopRefresh()
-                }
-            } else {
-                switchFragment(3)
-            }
-        }
-
         //切换Me页面Tab
         fun switchProfile() {
-            mClickPage = 4
+            mClickPage = 3
             if (mClickPage == mCurPosition) {
                 //重复点击
                 mProfileFragment?.let {
                     if (it is IFragmentRefresh) (it as IFragmentRefresh).scrollTopRefresh()
                 }
             } else {
-                switchFragment(4)
+                switchFragment(3)
             }
         }
 

+ 68 - 0
cpt_main/src/main/java/com/hongyegroup/cpt_main/ui/ProfileFragment.kt

@@ -0,0 +1,68 @@
+package com.hongyegroup.cpt_main.ui
+
+import android.os.Bundle
+import com.guadou.cs_cptservices.base.fragment.YYBaseVDBFragment
+import com.guadou.cs_cptservices.interfaces.IFragmentRefresh
+import com.guadou.lib_baselib.bean.DataBindingConfig
+import com.guadou.lib_baselib.utils.CommUtils
+import com.hongyegroup.cpt_main.BR
+import com.hongyegroup.cpt_main.R
+import com.hongyegroup.cpt_main.databinding.FragmentProfileBinding
+import com.hongyegroup.cpt_main.mvvm.ProfileViewModel
+import com.scwang.smart.refresh.layout.api.RefreshLayout
+import com.scwang.smart.refresh.layout.listener.OnRefreshListener
+
+/**
+ * 首页列表
+ */
+class ProfileFragment : YYBaseVDBFragment<ProfileViewModel, FragmentProfileBinding>(), IFragmentRefresh,
+    OnRefreshListener {
+
+    override fun getDataBindingConfig(): DataBindingConfig {
+        return DataBindingConfig(R.layout.fragment_profile, BR.viewModel, mViewModel)
+            .addBindingParams(BR.click, ClickProxy())
+    }
+
+    override fun startObserve() {
+    }
+
+    override fun init(savedInstanceState: Bundle?) {
+
+        initRV()
+        initData()
+        initListener()
+    }
+
+    private fun initData() {
+        showStateLoading()
+        CommUtils.getHandler().postDelayed({
+            showStateSuccess()
+        }, 1500)
+    }
+
+    private fun initListener() {
+
+    }
+
+    override fun onRefresh(refreshLayout: RefreshLayout) {
+
+    }
+
+
+    private fun initRV() {
+
+    }
+
+    override fun scrollTopRefresh() {
+
+    }
+
+    /**
+     * DataBinding事件处理
+     */
+    inner class ClickProxy {
+
+    }
+
+
+}

BIN
cpt_main/src/main/res/drawable-xxhdpi/home_newsfeed_categroy.webp


BIN
cpt_main/src/main/res/drawable-xxhdpi/home_rewards_categroy.webp


BIN
cpt_main/src/main/res/drawable-xxhdpi/home_top_point.webp


BIN
cpt_main/src/main/res/drawable-xxhdpi/home_yyjobs_categroy.webp


BIN
cpt_main/src/main/res/drawable-xxhdpi/iv_part_time_activities_blue_icon.webp


BIN
cpt_main/src/main/res/drawable-xxhdpi/iv_part_time_activities_gray_icon.webp


BIN
cpt_main/src/main/res/drawable-xxhdpi/iv_part_time_jobs_blue_icon.webp


BIN
cpt_main/src/main/res/drawable-xxhdpi/iv_part_time_jobs_gray_icon.webp


BIN
cpt_main/src/main/res/drawable-xxhdpi/main_home_blue.png


BIN
cpt_main/src/main/res/drawable-xxhdpi/main_home_blue.webp


BIN
cpt_main/src/main/res/drawable-xxhdpi/main_home_gray.png


BIN
cpt_main/src/main/res/drawable-xxhdpi/main_home_gray.webp


BIN
cpt_main/src/main/res/drawable-xxhdpi/main_me_blue.png


BIN
cpt_main/src/main/res/drawable-xxhdpi/main_me_blue.webp


BIN
cpt_main/src/main/res/drawable-xxhdpi/main_me_gray.png


BIN
cpt_main/src/main/res/drawable-xxhdpi/main_me_gray.webp


BIN
cpt_main/src/main/res/drawable-xxhdpi/main_newsfeed_blue.webp


BIN
cpt_main/src/main/res/drawable-xxhdpi/main_newsfeed_gray.webp


BIN
cpt_main/src/main/res/drawable-xxhdpi/main_wallet_blue.webp


BIN
cpt_main/src/main/res/drawable-xxhdpi/main_wallet_gray.webp


BIN
cpt_main/src/main/res/drawable-xxhdpi/main_yypay_blue.png


BIN
cpt_main/src/main/res/drawable-xxhdpi/main_yypay_gray.png


+ 0 - 11
cpt_main/src/main/res/drawable/selector_main_tab_active.xml

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

+ 11 - 0
cpt_main/src/main/res/drawable/selector_main_tab_newsfeed.xml

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

+ 0 - 11
cpt_main/src/main/res/drawable/selector_main_tab_partjob.xml

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

+ 6 - 6
cpt_main/src/main/res/drawable/selector_main_tab_wallet.xml

@@ -1,10 +1,10 @@
 <?xml version="1.0" encoding="utf-8"?>
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
 
-    <item android:drawable="@drawable/main_yypay_blue" android:state_pressed="true" />
-    <item android:drawable="@drawable/main_yypay_blue" android:state_selected="true" />
-    <item android:drawable="@drawable/main_yypay_blue" android:state_active="true" />
-    <item android:drawable="@drawable/main_yypay_gray" android:state_selected="false" />
-    <item android:drawable="@drawable/main_yypay_gray" android:state_active="false" />
-    <item android:drawable="@drawable/main_yypay_gray" android:state_pressed="false" />
+    <item android:drawable="@drawable/main_wallet_blue" android:state_pressed="true" />
+    <item android:drawable="@drawable/main_wallet_blue" android:state_selected="true" />
+    <item android:drawable="@drawable/main_wallet_blue" android:state_active="true" />
+    <item android:drawable="@drawable/main_wallet_gray" android:state_selected="false" />
+    <item android:drawable="@drawable/main_wallet_gray" android:state_active="false" />
+    <item android:drawable="@drawable/main_wallet_gray" android:state_pressed="false" />
 </selector>

+ 28 - 82
cpt_main/src/main/res/layout/activity_main.xml

@@ -56,8 +56,8 @@
 
                 <ImageView
                     android:id="@+id/iv_home_text"
-                    android:layout_width="@dimen/d_25dp"
-                    android:layout_height="@dimen/d_25dp"
+                    android:layout_width="@dimen/d_30dp"
+                    android:layout_height="@dimen/d_30dp"
                     android:src="@drawable/selector_main_tab_home"
                     app:layout_constraintBottom_toTopOf="@+id/tv_home_text"
                     app:layout_constraintLeft_toLeftOf="parent"
@@ -69,7 +69,6 @@
                     android:id="@+id/tv_home_text"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:layout_marginTop="@dimen/d_1dp"
                     android:text="首页"
                     android:textColor="@color/selector_tab_main_text"
                     android:textSize="@dimen/d_12sp"
@@ -95,91 +94,65 @@
 
             </androidx.constraintlayout.widget.ConstraintLayout>
 
-            <!-- 兼职 -->
-            <androidx.constraintlayout.widget.ConstraintLayout
-                android:id="@+id/group_tab_parttime"
+            <!--钱包-->
+            <LinearLayout
+                android:id="@+id/group_tab_wallet"
                 style="@style/SelectableItemBackgroundLess"
                 android:layout_width="0dp"
                 android:layout_height="wrap_content"
                 android:layout_weight="1"
-                android:onClick="@{() -> click.switchPartTime()}">
+                android:gravity="center"
+                android:onClick="@{() -> click.switchEWallet()}"
+                android:orientation="vertical">
 
                 <ImageView
-                    android:id="@+id/iv_parttime_text"
-                    android:layout_width="@dimen/d_25dp"
-                    android:layout_height="@dimen/d_25dp"
-                    android:src="@drawable/selector_main_tab_partjob"
-                    app:layout_constraintBottom_toTopOf="@+id/tv_parttime_text"
-                    app:layout_constraintLeft_toLeftOf="parent"
-                    app:layout_constraintRight_toRightOf="parent"
-                    app:layout_constraintTop_toTopOf="parent"
-                    app:layout_constraintVertical_chainStyle="packed" />
+                    android:layout_width="@dimen/d_30dp"
+                    android:layout_height="@dimen/d_30dp"
+                    android:src="@drawable/selector_main_tab_wallet" />
 
                 <com.guadou.lib_baselib.font_text_view.TextViewMedium
-                    android:id="@+id/tv_parttime_text"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:layout_marginTop="@dimen/d_1dp"
-                    android:text="兼职"
+                    android:text="钱包"
                     android:textColor="@color/selector_tab_main_text"
-                    android:textSize="@dimen/d_12sp"
-                    app:layout_constraintBottom_toBottomOf="parent"
-                    app:layout_constraintLeft_toLeftOf="parent"
-                    app:layout_constraintRight_toRightOf="parent"
-                    app:layout_constraintTop_toBottomOf="@+id/iv_parttime_text" />
-
-                <com.guadou.lib_baselib.font_text_view.TextViewRegular
-                    android:id="@+id/tv_parttime_unread_num"
-                    android:layout_width="@dimen/d_15dp"
-                    android:layout_height="@dimen/d_15dp"
-                    android:layout_marginLeft="@dimen/d_30dp"
-                    android:background="@drawable/shape_circle_red"
-                    android:gravity="center"
-                    android:text="2"
-                    android:textColor="@color/white"
-                    android:textSize="@dimen/d_8sp"
-                    android:visibility="gone"
-                    app:layout_constraintLeft_toLeftOf="parent"
-                    app:layout_constraintRight_toRightOf="parent"
-                    app:layout_constraintTop_toTopOf="parent" />
+                    android:textSize="@dimen/d_12sp" />
 
-            </androidx.constraintlayout.widget.ConstraintLayout>
+            </LinearLayout>
 
-            <!-- 工作状态 -->
+            <!-- 朋友圈 -->
             <androidx.constraintlayout.widget.ConstraintLayout
-                android:id="@+id/group_tab_actives"
+                android:id="@+id/group_tab_newsfeed"
                 style="@style/SelectableItemBackgroundLess"
                 android:layout_width="0dp"
                 android:layout_height="wrap_content"
                 android:layout_weight="1"
-                android:onClick="@{() -> click.switchActives()}">
+                android:onClick="@{() -> click.switchNewsFeed()}">
 
                 <ImageView
-                    android:id="@+id/iv_actives_text"
-                    android:layout_width="@dimen/d_25dp"
-                    android:layout_height="@dimen/d_25dp"
-                    android:src="@drawable/selector_main_tab_active"
-                    app:layout_constraintBottom_toTopOf="@+id/tv_actives_text"
+                    android:id="@+id/iv_newsfeed_text"
+                    android:layout_width="@dimen/d_30dp"
+                    android:layout_height="@dimen/d_30dp"
+                    android:src="@drawable/selector_main_tab_newsfeed"
+                    app:layout_constraintBottom_toTopOf="@+id/tv_newsfeed_text"
                     app:layout_constraintLeft_toLeftOf="parent"
                     app:layout_constraintRight_toRightOf="parent"
                     app:layout_constraintTop_toTopOf="parent"
                     app:layout_constraintVertical_chainStyle="packed" />
 
                 <com.guadou.lib_baselib.font_text_view.TextViewMedium
-                    android:id="@+id/tv_actives_text"
+                    android:id="@+id/tv_newsfeed_text"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:layout_marginTop="@dimen/d_1dp"
-                    android:text="工作状态"
+                    android:text="朋友圈"
                     android:textColor="@color/selector_tab_main_text"
                     android:textSize="@dimen/d_12sp"
                     app:layout_constraintBottom_toBottomOf="parent"
                     app:layout_constraintLeft_toLeftOf="parent"
                     app:layout_constraintRight_toRightOf="parent"
-                    app:layout_constraintTop_toBottomOf="@+id/iv_actives_text" />
+                    app:layout_constraintTop_toBottomOf="@+id/iv_newsfeed_text" />
 
                 <com.guadou.lib_baselib.font_text_view.TextViewRegular
-                    android:id="@+id/tv_actives_unread_num"
+                    android:id="@+id/tv_newsfeed_unread_num"
                     android:layout_width="@dimen/d_8dp"
                     android:layout_height="@dimen/d_8dp"
                     android:layout_marginLeft="@dimen/d_30dp"
@@ -193,32 +166,6 @@
 
             </androidx.constraintlayout.widget.ConstraintLayout>
 
-            <!--钱包-->
-            <LinearLayout
-                android:id="@+id/group_tab_wallet"
-                style="@style/SelectableItemBackgroundLess"
-                android:layout_width="0dp"
-                android:layout_height="wrap_content"
-                android:layout_weight="1"
-                android:gravity="center"
-                android:onClick="@{() -> click.switchEWallet()}"
-                android:orientation="vertical">
-
-                <ImageView
-                    android:layout_width="@dimen/d_25dp"
-                    android:layout_height="@dimen/d_25dp"
-                    android:src="@drawable/selector_main_tab_wallet" />
-
-                <com.guadou.lib_baselib.font_text_view.TextViewMedium
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:layout_marginTop="@dimen/d_1dp"
-                    android:text="钱包"
-                    android:textColor="@color/selector_tab_main_text"
-                    android:textSize="@dimen/d_12sp" />
-
-            </LinearLayout>
-
             <!-- 我的  -->
             <androidx.constraintlayout.widget.ConstraintLayout
                 android:id="@+id/group_tab_me"
@@ -230,8 +177,8 @@
 
                 <ImageView
                     android:id="@+id/iv_me_text"
-                    android:layout_width="@dimen/d_25dp"
-                    android:layout_height="@dimen/d_25dp"
+                    android:layout_width="@dimen/d_30dp"
+                    android:layout_height="@dimen/d_30dp"
                     android:src="@drawable/selector_main_tab_me"
                     app:layout_constraintBottom_toTopOf="@+id/tv_me_text"
                     app:layout_constraintLeft_toLeftOf="parent"
@@ -243,7 +190,6 @@
                     android:id="@+id/tv_me_text"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:layout_marginTop="@dimen/d_1dp"
                     android:text="我的"
                     android:textColor="@color/selector_tab_main_text"
                     android:textSize="@dimen/d_12sp"

+ 205 - 81
cpt_main/src/main/res/layout/fragment_home.xml

@@ -51,12 +51,12 @@
                 android:layout_gravity="center"
                 android:layout_marginRight="@dimen/d_15dp"
                 android:contentDescription="通知列表"
-                binding:clicks="@{click.gotoNotificationPage}"
                 android:src="@drawable/main_title_notification_icon"
                 android:visibility="visible"
                 app:layout_constraintBottom_toBottomOf="parent"
                 app:layout_constraintRight_toRightOf="parent"
-                app:layout_constraintTop_toTopOf="parent" />
+                app:layout_constraintTop_toTopOf="parent"
+                binding:clicks="@{click.gotoNotificationPage}" />
 
             <TextView
                 android:id="@+id/tv_badge_num"
@@ -99,7 +99,6 @@
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content" />
 
-
             <androidx.core.widget.NestedScrollView
                 android:id="@+id/scrollView"
                 android:layout_width="match_parent"
@@ -113,116 +112,241 @@
                     android:orientation="vertical">
 
                     <!--金额和Point显示-->
-                    <LinearLayout
+                    <androidx.constraintlayout.widget.ConstraintLayout
                         android:layout_width="match_parent"
                         android:layout_height="56dp"
+                        android:layout_weight="1"
+                        android:gravity="center_vertical"
+                        android:orientation="horizontal"
+                        binding:clicks="@{click.gotoWalletPage}">
+
+                        <ImageView
+                            android:id="@+id/icon_wallet"
+                            android:layout_width="@dimen/d_28dp"
+                            android:layout_height="@dimen/d_28dp"
+                            android:layout_marginLeft="@dimen/d_16dp"
+                            android:src="@drawable/home_top_wallet"
+                            app:layout_constraintBottom_toBottomOf="parent"
+                            app:layout_constraintLeft_toLeftOf="parent"
+                            app:layout_constraintTop_toTopOf="parent" />
+
+                        <View
+                            android:layout_width="21dp"
+                            android:layout_height="10dp"
+                            android:layout_marginBottom="@dimen/d_20dp"
+                            android:background="@drawable/chat_new_icon"
+                            app:layout_constraintBottom_toBottomOf="@id/icon_wallet"
+                            app:layout_constraintLeft_toRightOf="@id/icon_wallet"
+                            app:layout_constraintRight_toRightOf="@id/icon_wallet" />
+
+
+                        <com.guadou.lib_baselib.font_text_view.TextViewMedium
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:layout_marginLeft="@dimen/d_14dp"
+                            android:text="钱包"
+                            android:textColor="@color/black"
+                            android:textSize="@dimen/d_14sp"
+                            app:layout_constraintBottom_toBottomOf="parent"
+                            app:layout_constraintLeft_toRightOf="@id/icon_wallet"
+                            app:layout_constraintTop_toTopOf="parent" />
+
+                        <com.guadou.lib_baselib.font_text_view.TextViewMedium
+                            android:id="@+id/tv_wallet_money"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:layout_marginLeft="@dimen/d_14dp"
+                            android:layout_marginRight="@dimen/d_7dp"
+                            android:text="¥ 0"
+                            android:textColor="@color/black"
+                            android:textSize="@dimen/d_14dsp"
+                            app:layout_constraintBottom_toBottomOf="parent"
+                            app:layout_constraintRight_toLeftOf="@id/iv_back_more"
+                            app:layout_constraintTop_toTopOf="parent" />
+
+                        <ImageView
+                            android:id="@+id/iv_back_more"
+                            android:layout_width="5dp"
+                            android:layout_height="9dp"
+                            android:layout_marginLeft="@dimen/d_7dp"
+                            android:layout_marginRight="@dimen/d_15dp"
+                            android:src="@drawable/home_top_more"
+                            app:layout_constraintBottom_toBottomOf="parent"
+                            app:layout_constraintRight_toRightOf="parent"
+                            app:layout_constraintTop_toTopOf="parent" />
+
+                    </androidx.constraintlayout.widget.ConstraintLayout>
+
+                    <View
+                        android:layout_width="match_parent"
+                        android:layout_height="@dimen/d_10dp"
+                        android:background="@color/divider_color_f689" />
+
+                    <!--  分类   -->
+                    <LinearLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
                         android:orientation="horizontal">
 
-                        <androidx.constraintlayout.widget.ConstraintLayout
+                        <!--兼职-->
+                        <LinearLayout
+                            android:id="@+id/ll_yy_jobs"
                             android:layout_width="0dp"
-                            android:layout_height="match_parent"
+                            android:layout_height="wrap_content"
                             android:layout_weight="1"
-                            android:gravity="center_vertical"
-                            android:orientation="horizontal"
-                            binding:clicks="@{click.gotoWalletPage}">
-
-                            <ImageView
-                                android:id="@+id/icon_wallet"
-                                android:layout_width="@dimen/d_28dp"
-                                android:layout_height="@dimen/d_28dp"
-                                android:layout_marginLeft="@dimen/d_16dp"
-                                android:src="@drawable/home_top_wallet"
-                                app:layout_constraintBottom_toBottomOf="parent"
-                                app:layout_constraintLeft_toLeftOf="parent"
-                                app:layout_constraintTop_toTopOf="parent" />
-
-                            <View
-                                android:layout_width="21dp"
-                                android:layout_height="10dp"
-                                android:layout_marginBottom="@dimen/d_20dp"
-                                android:background="@drawable/chat_new_icon"
-                                app:layout_constraintBottom_toBottomOf="@id/icon_wallet"
-                                app:layout_constraintLeft_toRightOf="@id/icon_wallet"
-                                app:layout_constraintRight_toRightOf="@id/icon_wallet" />
-
-                            <com.guadou.lib_baselib.font_text_view.TextViewRegular
-                                android:id="@+id/tv_wallet_money"
+                            android:gravity="center_horizontal"
+                            android:orientation="vertical"
+                            binding:clicks="@{click.gotoParttimePage}">
+
+                            <RelativeLayout
+                                android:layout_width="@dimen/d_70dp"
+                                android:layout_height="@dimen/d_70dp"
+                                android:layout_marginTop="@dimen/d_16dp">
+
+                                <ImageView
+                                    android:id="@+id/iv_category_yyjobs"
+                                    android:layout_width="@dimen/d_70dp"
+                                    android:layout_height="@dimen/d_70dp"
+                                    android:src="@drawable/home_yyjobs_categroy" />
+
+                                <!-- 未读数量 -->
+                                <View
+                                    android:id="@+id/view_parttime_unread"
+                                    android:layout_width="@dimen/d_8dp"
+                                    android:layout_height="@dimen/d_8dp"
+                                    android:layout_alignParentRight="true"
+                                    android:background="@drawable/shape_circle_red"
+                                    android:gravity="center"
+                                    android:textColor="@color/white"
+                                    android:visibility="gone" />
+
+                            </RelativeLayout>
+
+                            <com.guadou.lib_baselib.font_text_view.TextViewBold
+                                android:id="@+id/tv_category_parttime"
                                 android:layout_width="wrap_content"
                                 android:layout_height="wrap_content"
-                                android:layout_marginLeft="@dimen/d_14dp"
-                                android:text="¥ 0"
+                                android:layout_marginTop="@dimen/d_3dp"
+                                android:text="兼职工作"
                                 android:textColor="@color/black"
-                                android:textSize="@dimen/d_14sp"
-                                app:layout_constraintBottom_toBottomOf="parent"
-                                app:layout_constraintLeft_toRightOf="@id/icon_wallet"
-                                app:layout_constraintTop_toTopOf="parent" />
-
-                            <ImageView
-                                android:layout_width="5dp"
-                                android:layout_height="9dp"
-                                android:layout_marginLeft="@dimen/d_7dp"
-                                android:src="@drawable/home_top_more"
-                                app:layout_constraintBottom_toBottomOf="parent"
-                                app:layout_constraintLeft_toRightOf="@id/tv_wallet_money"
-                                app:layout_constraintTop_toTopOf="parent" />
+                                android:textSize="@dimen/d_14dsp" />
 
+                        </LinearLayout>
 
-                        </androidx.constraintlayout.widget.ConstraintLayout>
+                        <!--News Feed-->
+                        <LinearLayout
+                            android:id="@+id/ll_news_feed"
+                            android:layout_width="0dp"
+                            android:layout_height="wrap_content"
+                            android:layout_weight="1"
+                            android:gravity="center_horizontal"
+                            android:orientation="vertical"
+                            binding:clicks="@{click.gotoNewsFeedTab}">
+
+                            <RelativeLayout
+                                android:layout_width="@dimen/d_70dp"
+                                android:layout_height="@dimen/d_70dp"
+                                android:layout_marginTop="@dimen/d_16dp">
+
+                                <ImageView
+                                    android:id="@+id/iv_category_newsfeed"
+                                    android:layout_width="@dimen/d_70dp"
+                                    android:layout_height="@dimen/d_70dp"
+                                    android:src="@drawable/home_newsfeed_categroy" />
+
+                                <!-- NewsFeed未读提示-->
+                                <View
+                                    android:id="@+id/view_newsfeed_unread"
+                                    android:layout_width="@dimen/d_8dp"
+                                    android:layout_height="@dimen/d_8dp"
+                                    android:layout_alignParentRight="true"
+                                    android:background="@drawable/shape_circle_red"
+                                    android:gravity="center"
+                                    android:textColor="@color/white"
+                                    android:visibility="gone" />
+
+                                <!-- NewsFeed未读数量-->
+                                <TextView
+                                    android:id="@+id/tv_newsfeed_replay_count"
+                                    android:layout_width="wrap_content"
+                                    android:layout_height="wrap_content"
+                                    android:layout_alignParentRight="true"
+                                    android:background="@drawable/badge_red"
+                                    android:paddingLeft="@dimen/d_6dp"
+                                    android:paddingTop="@dimen/d_1dp"
+                                    android:paddingRight="@dimen/d_6dp"
+                                    android:paddingBottom="@dimen/d_1dp"
+                                    android:text="0"
+                                    android:textColor="@color/white"
+                                    android:textSize="8sp"
+                                    android:visibility="gone" />
+
+                            </RelativeLayout>
+
+                            <com.guadou.lib_baselib.font_text_view.TextViewBold
+                                android:id="@+id/tv_category_news_feed"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:layout_marginTop="@dimen/d_3dp"
+                                android:text="朋友圈"
+                                android:textColor="@color/black"
+                                android:textSize="@dimen/d_14dsp" />
 
-                        <View
-                            android:layout_width="@dimen/d_1dp"
-                            android:layout_height="match_parent"
-                            android:background="@color/divider_color_f0" />
+                        </LinearLayout>
 
+                        <!--Rewards-->
                         <LinearLayout
+                            android:id="@+id/ll_rewards"
                             android:layout_width="0dp"
-                            android:layout_height="match_parent"
+                            android:layout_height="wrap_content"
                             android:layout_weight="1"
-                            android:gravity="center_vertical"
-                            android:orientation="horizontal"
+                            android:gravity="center_horizontal"
+                            android:orientation="vertical"
                             binding:clicks="@{click.gotoRewardsPage}">
 
-                            <ImageView
-                                android:id="@+id/icon_rewards"
-                                android:layout_width="wrap_content"
-                                android:layout_height="wrap_content"
-                                android:layout_marginLeft="@dimen/d_19dp"
-                                android:src="@drawable/home_top_point"
-                                app:layout_constraintBottom_toBottomOf="parent"
-                                app:layout_constraintLeft_toLeftOf="parent"
-                                app:layout_constraintTop_toTopOf="parent" />
+                            <RelativeLayout
+                                android:layout_width="@dimen/d_70dp"
+                                android:layout_height="@dimen/d_70dp"
+                                android:layout_marginTop="@dimen/d_16dp">
+
+                                <ImageView
+                                    android:id="@+id/iv_category_rewards"
+                                    android:layout_width="@dimen/d_70dp"
+                                    android:layout_height="@dimen/d_70dp"
+                                    android:src="@drawable/home_rewards_categroy" />
+
+                                <View
+                                    android:id="@+id/view_rewards_unread"
+                                    android:layout_width="@dimen/d_8dp"
+                                    android:layout_height="@dimen/d_8dp"
+                                    android:layout_alignParentRight="true"
+                                    android:background="@drawable/shape_circle_red"
+                                    android:gravity="center"
+                                    android:textColor="@color/white"
+                                    android:visibility="gone" />
 
-                            <com.guadou.lib_baselib.font_text_view.TextViewRegular
+                            </RelativeLayout>
+
+
+                            <com.guadou.lib_baselib.font_text_view.TextViewBold
+                                android:id="@+id/tv_category_rewards"
                                 android:layout_width="wrap_content"
                                 android:layout_height="wrap_content"
-                                android:layout_marginLeft="@dimen/d_10dp"
-                                android:text="0 积分"
+                                android:layout_marginTop="@dimen/d_3dp"
+                                android:text="积分兑换"
                                 android:textColor="@color/black"
-                                android:textColorHint="@color/black"
-                                android:textSize="@dimen/d_14sp" />
-
-                            <ImageView
-                                android:layout_width="@dimen/d_5dp"
-                                android:layout_height="@dimen/d_9dp"
-                                android:layout_marginLeft="@dimen/d_7dp"
-                                android:src="@drawable/home_top_more" />
-
+                                android:textSize="@dimen/d_14dsp" />
 
                         </LinearLayout>
 
                     </LinearLayout>
 
-                    <View
-                        android:layout_width="match_parent"
-                        android:layout_height="@dimen/d_10dp"
-                        android:background="@color/divider_color_f689" />
-
                     <!--轮播-->
                     <com.minminaya.widget.GeneralRoundConstraintLayout
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
                         android:layout_marginLeft="@dimen/d_15dp"
-                        android:layout_marginTop="@dimen/d_16dp"
+                        android:layout_marginTop="@dimen/d_18dp"
                         android:layout_marginRight="@dimen/d_15dp"
                         app:corner_radius="@dimen/d_5dp">
 

+ 83 - 0
cpt_main/src/main/res/layout/fragment_profile.xml

@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:binding="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    tools:ignore="RtlHardcoded">
+
+    <data>
+
+        <variable
+            name="viewModel"
+            type="com.hongyegroup.cpt_main.mvvm.ProfileViewModel" />
+
+        <variable
+            name="click"
+            type="com.hongyegroup.cpt_main.ui.ProfileFragment.ClickProxy" />
+
+    </data>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:background="@color/white"
+        android:orientation="vertical">
+
+        <com.guadou.lib_baselib.view.titlebar.StatusbarGrayView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content" />
+
+        <FrameLayout
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_46dp">
+
+            <com.guadou.lib_baselib.font_text_view.TextViewMedium
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:text="个人状态页面"
+                android:textColor="@color/black"
+                android:textSize="@dimen/d_18sp" />
+
+            <com.guadou.lib_baselib.font_text_view.TextViewMedium
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="right|center_vertical"
+                android:layout_marginRight="@dimen/d_15dp"
+                android:text="全部已读"
+                android:textColor="@color/profile_red"
+                android:textSize="@dimen/d_16sp" />
+
+        </FrameLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_0.7dp"
+            android:background="@color/divider_color_ee" />
+
+        <com.scwang.smart.refresh.layout.SmartRefreshLayout
+            android:id="@+id/refresh_layout"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:focusable="true"
+            android:focusableInTouchMode="true"
+            app:srlEnablePreviewInEditMode="true"
+            app:srlPrimaryColor="@color/white">
+
+            <com.scwang.smart.refresh.header.ClassicsHeader
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content" />
+
+
+            <TextView
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:gravity="center"
+                android:text="我的页面" />
+
+        </com.scwang.smart.refresh.layout.SmartRefreshLayout>
+
+    </LinearLayout>
+
+
+</layout>

+ 1 - 0
cpt_newsfeed/.gitignore

@@ -0,0 +1 @@
+/build

+ 6 - 0
cpt_newsfeed/build.gradle

@@ -0,0 +1,6 @@
+apply from: "../module_default_config.gradle"
+
+dependencies {
+    //九宫格控件
+    implementation project(':cs_ninegrid')
+}

+ 21 - 0
cpt_newsfeed/proguard-rules.pro

@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+#   public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile

+ 26 - 0
cpt_newsfeed/src/androidTest/java/com/hongyegroup/cpt_main/ExampleInstrumentedTest.java

@@ -0,0 +1,26 @@
+package com.hongyegroup.cpt_main;
+
+import android.content.Context;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+    @Test
+    public void useAppContext() {
+        // Context of the app under test.
+        Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+        assertEquals("com.hongyegroup.cpt_parttime", appContext.getPackageName());
+    }
+}

+ 17 - 0
cpt_newsfeed/src/main/AndroidManifest.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.hongyegroup.cpt_newsfeed">
+
+    <application android:allowBackup="true">
+
+        <activity android:name=".ui.NewsFeedDetailActivity" />
+
+        <activity android:name=".ui.NewsFeedPostActivity" />
+
+        <activity android:name=".ui.NewsFeedFollowsActivity" />
+
+        <activity android:name=".ui.NewsFeedProfileActivity" />
+
+    </application>
+
+</manifest>

+ 30 - 0
cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/adapter/NewsFeedListAdapter.kt

@@ -0,0 +1,30 @@
+package com.hongyegroup.cpt_newsfeed.adapter
+
+import com.chad.library.adapter.base.BaseMultiItemQuickAdapter
+import com.chad.library.adapter.base.module.LoadMoreModule
+import com.chad.library.adapter.base.viewholder.BaseViewHolder
+import com.guadou.cs_cptservices.YYConstants
+import com.hongyegroup.cpt_newsfeed.R
+import com.hongyegroup.cpt_newsfeed.bean.NewsFeedAdatperBean
+
+/**
+ * 列表适配器
+ */
+class NewsFeedListAdapter(list: MutableList<NewsFeedAdatperBean>)
+    : BaseMultiItemQuickAdapter<NewsFeedAdatperBean, BaseViewHolder>(list), LoadMoreModule {
+
+    private var mTvWidth: Int = 0
+
+    init {
+        addItemType(YYConstants.NEWS_FEED_TYPE_NEWS, R.layout.item_news_feed_news)
+//        addItemType(YYConstants.NEWS_FEED_TYPE_BALLOT, R.layout.item_news_feed_ballot)
+//        addItemType(YYConstants.NEWS_FEED_TYPE_VIDEO, R.layout.item_news_feed_video)
+
+//        mTvWidth = ScreenUtils.getScreenWidth(context) - CommUtils.dip2px(45)
+    }
+
+    override fun convert(holder: BaseViewHolder, item: NewsFeedAdatperBean) {
+
+    }
+
+}

+ 132 - 0
cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/bean/NewsFeedAdatperBean.java

@@ -0,0 +1,132 @@
+package com.hongyegroup.cpt_newsfeed.bean;
+
+import com.chad.library.adapter.base.entity.MultiItemEntity;
+import com.google.gson.annotations.SerializedName;
+import com.guadou.cs_cptservices.YYConstants;
+import com.guadou.ninegrid.ImageInfo;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 朋友圈展示每一个动态的bean对象
+ * 分为两种 一种为动态 一种为投票
+ */
+public class NewsFeedAdatperBean implements Serializable, MultiItemEntity {
+
+    /* 动态 */
+    @SerializedName("id")
+    public String id;               //当前newsFeed的服务器id
+
+    @SerializedName("type")
+    public String type;                //当前newsFeed的类型 content是动态  poll是投票  video是视频模式
+
+    @SerializedName("group_id")
+    public String group_id;            //是否是圈子内的消息-圈子Id
+
+    @SerializedName("group_name")
+    public String group_name;       //圈子的名字
+
+    @SerializedName("topics")
+    public List<TopicBean> topics;           //相关的话题集合
+
+    @SerializedName("avatar")
+    public String avatar;           //当前newsFeed的发布者头像
+
+    @SerializedName("publish_member_id")
+    public String member_id;         //发布者的Id
+
+    @SerializedName("publish_by")
+    public String username;         //当前newsFeed的发布者姓名  如果为空展示YY Part Time Jobs
+
+    @SerializedName("likes_count")
+    public int likeNum;                    //当前newsFeed的点赞数量
+
+    @SerializedName("likes")
+    public List<LikeBean> likes;       //用于判断是否点赞
+
+    @SerializedName("comments_count")
+    public int commentNum;                 //当前newsFeed的评论数量
+
+    @SerializedName("share_count")
+    public int share_count;                 //当前newsFeed的分享数量
+
+    public String follow;          //判断是否关注
+
+    public int publish_fans_count;   //这个News的发布者的粉丝数量
+
+    /* 投票 */
+    @SerializedName("description")
+    public String contentDesc = "";          //动态和投票的内容
+
+    @SerializedName("question")
+    public String ballotQuestion;        //投票的问题
+
+    @SerializedName("poll_type")
+    public String ballotOptionType;      //投票文本的类型是图片还是文本 Image
+
+    @SerializedName("resources")
+    public List<OptionBean> resources;  //动态的两种type的资源都在这里
+
+    public int resource_type;   //resource的类型,1是默认的 2是视频
+
+
+    // ================== 自定义属性 begin ↓ ======================
+
+    public boolean myIsContentExpand;        //记录动态类型->当前newsFeed的内容是否展开了,默认为false(非服务器数据->列表是否展开了?)
+    public boolean myIsMyOptionSelected;     //记录投票类型->是否已经选择了 。需要判断 如果votes的length全部为0 就没有选择
+    public int myPollSelectedIndex = -1;    //已经选择的索引,默认没选择为-1
+    public List<ImageInfo> myNewsResources;  //动态的资源
+    public List<ImageInfo> myPollImages;      //投票的图片资源
+
+
+    //    public List<String> myPoolTexts;       //投票的文字资源
+//    public boolean isNewFollow = false;           //自定义的属性->是否是刚刚新关注的
+
+    // ================== 自定义属性 end ↑ ======================
+
+    //多类型布局
+    @Override
+    public int getItemType() {
+        if (type.equals("Video")) {
+            return YYConstants.NEWS_FEED_TYPE_VIDEO;
+        } else if (type.equals("poll")) {
+            return YYConstants.NEWS_FEED_TYPE_BALLOT;
+        } else {
+            return YYConstants.NEWS_FEED_TYPE_NEWS;
+        }
+    }
+
+
+    //每一个投票选项的数据
+    public static class OptionBean implements Serializable {
+        @SerializedName("id")
+        public String optionId;
+        @SerializedName("text")
+        public String textContent;
+        @SerializedName("image")
+        public String imgurl;
+        @SerializedName("votes")
+        public List<Object> votes;   //判断当前用户是否投票了
+        @SerializedName("votes_count")
+        public int votes_count;   //当前投票的总数量
+    }
+
+    @SerializedName("created_at")
+    public String publishDate;   //不同type共有的发布时间
+
+    public String micro_at;     //时间戳
+
+
+    public static class LikeBean implements Serializable {
+        public String likeable_type;
+        public int emoticon_id = 1;
+
+    }
+
+    public static class TopicBean implements Serializable {
+        public String topic_id;
+        public String topic_name;
+    }
+
+}

+ 13 - 0
cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/mvvm/NewsFeedDetailViewModel.kt

@@ -0,0 +1,13 @@
+package com.hongyegroup.cpt_newsfeed.mvvm
+
+import androidx.lifecycle.SavedStateHandle
+import com.guadou.lib_baselib.base.vm.BaseViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import javax.inject.Inject
+
+@HiltViewModel
+class NewsFeedDetailViewModel @Inject constructor(
+    private val savedStateHandle: SavedStateHandle
+) : BaseViewModel() {
+
+}

+ 13 - 0
cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/mvvm/NewsFeedFansViewModel.kt

@@ -0,0 +1,13 @@
+package com.hongyegroup.cpt_newsfeed.mvvm
+
+import androidx.lifecycle.SavedStateHandle
+import com.guadou.lib_baselib.base.vm.BaseViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import javax.inject.Inject
+
+@HiltViewModel
+class NewsFeedFansViewModel @Inject constructor(
+    private val savedStateHandle: SavedStateHandle
+) : BaseViewModel() {
+
+}

+ 13 - 0
cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/mvvm/NewsFeedFollowViewModel.kt

@@ -0,0 +1,13 @@
+package com.hongyegroup.cpt_newsfeed.mvvm
+
+import androidx.lifecycle.SavedStateHandle
+import com.guadou.lib_baselib.base.vm.BaseViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import javax.inject.Inject
+
+@HiltViewModel
+class NewsFeedFollowViewModel @Inject constructor(
+    private val savedStateHandle: SavedStateHandle
+) : BaseViewModel() {
+
+}

+ 98 - 0
cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/mvvm/NewsFeedFollowingViewModel.kt

@@ -0,0 +1,98 @@
+package com.hongyegroup.cpt_newsfeed.mvvm
+
+import android.annotation.SuppressLint
+import android.view.View
+import android.widget.TextView
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.SavedStateHandle
+import com.guadou.lib_baselib.base.vm.BaseViewModel
+import com.guadou.lib_baselib.ext.checkEmpty
+import com.guadou.lib_baselib.utils.CommUtils
+import com.hongyegroup.cpt_newsfeed.R
+import com.hongyegroup.cpt_newsfeed.adapter.NewsFeedListAdapter
+import com.hongyegroup.cpt_newsfeed.bean.NewsFeedAdatperBean
+import dagger.hilt.android.lifecycle.HiltViewModel
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.withContext
+import javax.inject.Inject
+
+@HiltViewModel
+class NewsFeedFollowingViewModel @Inject constructor(
+    private val savedStateHandle: SavedStateHandle
+) : BaseViewModel() {
+
+    var mCurPage = 1
+    var isNeedPlaceHolder = true
+    var isNeedCleanAllData = true
+
+    var mDatas = mutableListOf<NewsFeedAdatperBean>()
+    val mAdapter by lazy { NewsFeedListAdapter(mDatas) }
+
+    /**
+     * 获取动态的数据
+     */
+    fun getNewsFeedList() : LiveData<Boolean> {
+        val liveData = MutableLiveData<Boolean>()
+
+        launchOnUI {
+            //开始Loading
+            if (isNeedPlaceHolder) loadStartLoading()
+            val result = withContext(Dispatchers.IO) {
+                delay(1000)
+
+                val list = mutableListOf<NewsFeedAdatperBean>()
+                for (i in 1..10) {
+                    list.add(NewsFeedAdatperBean().apply {
+                        type = "news"
+                    })
+                }
+                return@withContext list
+            }
+
+            loadSuccess()
+            handleData(result)
+            liveData.postValue(true)
+
+        }
+
+        return liveData
+    }
+
+    //处理数据-添加或刷新
+    @SuppressLint("NotifyDataSetChanged")
+    private fun handleData(list: List<NewsFeedAdatperBean>?) {
+        if (!list.checkEmpty()) {
+            //有数据,判断是刷新还是加载更多的数据
+            if (isNeedCleanAllData) {
+                //刷新的方式
+                mDatas.clear()
+                mDatas.addAll(list!!)
+                mAdapter.notifyDataSetChanged()
+            } else {
+                //加载更多
+                mDatas.addAll(list!!)
+                mAdapter.notifyItemRangeInserted(mDatas.size - list.size, list.size)
+                mAdapter.loadMoreModule.loadMoreComplete()
+            }
+        } else {
+            //展示无数据
+            if (isNeedCleanAllData && mCurPage == 1) {
+                mDatas.clear()
+                mAdapter.notifyDataSetChanged()
+                //展示无数据的布局
+                val emptyView: View = CommUtils.inflate(R.layout.item_empty_layout)
+                emptyView.findViewById<TextView>(R.id.tv_empty_msg).text = "暂无任何动态"
+                mAdapter.setEmptyView(emptyView)
+            } else {
+                //如果是加载更多,展示加载完成,没有更多数据了
+                mAdapter.loadMoreModule.loadMoreEnd()
+            }
+        }
+        isNeedPlaceHolder = false
+        isNeedCleanAllData = false
+    }
+
+
+}

+ 13 - 0
cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/mvvm/NewsFeedFollowsViewModel.kt

@@ -0,0 +1,13 @@
+package com.hongyegroup.cpt_newsfeed.mvvm
+
+import androidx.lifecycle.SavedStateHandle
+import com.guadou.lib_baselib.base.vm.BaseViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import javax.inject.Inject
+
+@HiltViewModel
+class NewsFeedFollowsViewModel @Inject constructor(
+    private val savedStateHandle: SavedStateHandle
+) : BaseViewModel() {
+
+}

+ 16 - 0
cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/mvvm/NewsFeedMainViewModel.kt

@@ -0,0 +1,16 @@
+package com.hongyegroup.cpt_newsfeed.mvvm
+
+import androidx.fragment.app.Fragment
+import androidx.lifecycle.SavedStateHandle
+import com.guadou.lib_baselib.base.vm.BaseViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import javax.inject.Inject
+
+@HiltViewModel
+class NewsFeedMainViewModel @Inject constructor(
+    private val savedStateHandle: SavedStateHandle
+) : BaseViewModel() {
+
+    val mFragments = mutableListOf<Fragment>()
+
+}

+ 13 - 0
cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/mvvm/NewsFeedMomentViewModel.kt

@@ -0,0 +1,13 @@
+package com.hongyegroup.cpt_newsfeed.mvvm
+
+import androidx.lifecycle.SavedStateHandle
+import com.guadou.lib_baselib.base.vm.BaseViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import javax.inject.Inject
+
+@HiltViewModel
+class NewsFeedMomentViewModel @Inject constructor(
+    private val savedStateHandle: SavedStateHandle
+) : BaseViewModel() {
+
+}

+ 13 - 0
cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/mvvm/NewsFeedPostViewModel.kt

@@ -0,0 +1,13 @@
+package com.hongyegroup.cpt_newsfeed.mvvm
+
+import androidx.lifecycle.SavedStateHandle
+import com.guadou.lib_baselib.base.vm.BaseViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import javax.inject.Inject
+
+@HiltViewModel
+class NewsFeedPostViewModel @Inject constructor(
+    private val savedStateHandle: SavedStateHandle
+) : BaseViewModel() {
+
+}

+ 13 - 0
cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/mvvm/NewsFeedProfileViewModel.kt

@@ -0,0 +1,13 @@
+package com.hongyegroup.cpt_newsfeed.mvvm
+
+import androidx.lifecycle.SavedStateHandle
+import com.guadou.lib_baselib.base.vm.BaseViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import javax.inject.Inject
+
+@HiltViewModel
+class NewsFeedProfileViewModel @Inject constructor(
+    private val savedStateHandle: SavedStateHandle
+) : BaseViewModel() {
+
+}

+ 24 - 0
cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/router/NewsFeedComponentServiceImpl.kt

@@ -0,0 +1,24 @@
+package com.hongyegroup.cpt_newsfeed.router
+
+import android.content.Context
+import androidx.fragment.app.Fragment
+import com.alibaba.android.arouter.facade.annotation.Route
+import com.guadou.cs_router.ARouterPath
+import com.guadou.cs_router.newsfeed.INewsFeedComponentServer
+import com.hongyegroup.cpt_newsfeed.ui.NewsFeedMainFragment
+
+@Route(path = ARouterPath.PATH_SERVICE_NEWSFEED, name = "NewsFeed模块路由服务")
+class NewsFeedComponentServiceImpl : INewsFeedComponentServer {
+
+    override fun startNewsFeedPostPage() {
+    }
+
+    override fun obtainNewsFeedMainFragment(): Fragment {
+        return NewsFeedMainFragment()
+    }
+
+    override fun init(context: Context?) {
+    }
+
+
+}

+ 53 - 0
cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/ui/NewsFeedDetailActivity.kt

@@ -0,0 +1,53 @@
+package com.hongyegroup.cpt_newsfeed.ui
+
+import android.content.Intent
+import android.os.Bundle
+import com.guadou.cs_cptservices.base.activity.YYBaseVDBActivity
+import com.guadou.lib_baselib.bean.DataBindingConfig
+import com.guadou.lib_baselib.utils.CommUtils
+import com.guadou.lib_baselib.utils.KeyboardUtils
+import com.hongyegroup.cpt_newsfeed.BR
+import com.hongyegroup.cpt_newsfeed.R
+import com.hongyegroup.cpt_newsfeed.databinding.ActivityNewsfeedDetailBinding
+import com.hongyegroup.cpt_newsfeed.mvvm.NewsFeedDetailViewModel
+import dagger.hilt.android.AndroidEntryPoint
+
+/**
+ * 动态详情页面
+ */
+@AndroidEntryPoint
+class NewsFeedDetailActivity : YYBaseVDBActivity<NewsFeedDetailViewModel, ActivityNewsfeedDetailBinding>() {
+
+    companion object {
+        fun startInstance() {
+            val context = CommUtils.getContext()
+            val intent = Intent(context, NewsFeedDetailActivity::class.java)
+            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+            context.startActivity(intent)
+        }
+    }
+
+    override fun getDataBindingConfig(): DataBindingConfig {
+        return DataBindingConfig(R.layout.activity_newsfeed_detail, BR.viewModel, mViewModel)
+            .addBindingParams(BR.click, ClickProxy())
+    }
+
+    override fun init(savedInstanceState: Bundle?) {
+        setStatusBarBlackText()
+    }
+
+    override fun startObserve() {
+
+    }
+
+    /**
+     * DataBinding事件处理
+     */
+    inner class ClickProxy {
+
+        fun selectCountryCode() {
+            KeyboardUtils.hideSoftInput(mActivity)
+        }
+
+    }
+}

+ 44 - 0
cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/ui/NewsFeedFansFragment.kt

@@ -0,0 +1,44 @@
+package com.hongyegroup.cpt_newsfeed.ui
+
+import android.os.Bundle
+import com.guadou.cs_cptservices.base.fragment.YYBaseVDBLazyLoadingFragment
+import com.guadou.lib_baselib.bean.DataBindingConfig
+import com.guadou.lib_baselib.utils.KeyboardUtils
+import com.hongyegroup.cpt_newsfeed.BR
+import com.hongyegroup.cpt_newsfeed.R
+import com.hongyegroup.cpt_newsfeed.databinding.FragmentNewsfeedFansBinding
+import com.hongyegroup.cpt_newsfeed.mvvm.NewsFeedFansViewModel
+
+/**
+ * 关注我的人员列表 粉丝列表
+ */
+class NewsFeedFansFragment : YYBaseVDBLazyLoadingFragment<NewsFeedFansViewModel, FragmentNewsfeedFansBinding>() {
+
+    override fun getDataBindingConfig(): DataBindingConfig {
+        return DataBindingConfig(R.layout.fragment_newsfeed_fans, BR.viewModel, mViewModel)
+            .addBindingParams(BR.click, ClickProxy())
+    }
+
+    override fun init(savedInstanceState: Bundle?) {
+    }
+
+    override fun onLazyInitData() {
+
+    }
+
+    override fun startObserve() {
+
+    }
+
+    /**
+     * DataBinding事件处理
+     */
+    inner class ClickProxy {
+
+        fun selectCountryCode() {
+            KeyboardUtils.hideSoftInput(mActivity)
+        }
+
+    }
+
+}

+ 42 - 0
cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/ui/NewsFeedFollowFragment.kt

@@ -0,0 +1,42 @@
+package com.hongyegroup.cpt_newsfeed.ui
+
+import android.os.Bundle
+import com.guadou.cs_cptservices.base.fragment.YYBaseVDBLazyLoadingFragment
+import com.guadou.lib_baselib.bean.DataBindingConfig
+import com.guadou.lib_baselib.utils.KeyboardUtils
+import com.hongyegroup.cpt_newsfeed.BR
+import com.hongyegroup.cpt_newsfeed.R
+import com.hongyegroup.cpt_newsfeed.databinding.FragmentNewsfeedFollowBinding
+import com.hongyegroup.cpt_newsfeed.mvvm.NewsFeedFollowViewModel
+
+/**
+ * 我关注的人员列表
+ */
+class NewsFeedFollowFragment : YYBaseVDBLazyLoadingFragment<NewsFeedFollowViewModel, FragmentNewsfeedFollowBinding>() {
+
+    override fun getDataBindingConfig(): DataBindingConfig {
+        return DataBindingConfig(R.layout.fragment_newsfeed_follow, BR.viewModel, mViewModel)
+            .addBindingParams(BR.click, ClickProxy())
+    }
+
+    override fun init(savedInstanceState: Bundle?) {
+    }
+
+    override fun onLazyInitData() {
+    }
+
+    override fun startObserve() {
+    }
+
+    /**
+     * DataBinding事件处理
+     */
+    inner class ClickProxy {
+
+        fun selectCountryCode() {
+            KeyboardUtils.hideSoftInput(mActivity)
+        }
+
+    }
+
+}

+ 53 - 0
cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/ui/NewsFeedFollowsActivity.kt

@@ -0,0 +1,53 @@
+package com.hongyegroup.cpt_newsfeed.ui
+
+import android.content.Intent
+import android.os.Bundle
+import com.guadou.cs_cptservices.base.activity.YYBaseVDBActivity
+import com.guadou.lib_baselib.bean.DataBindingConfig
+import com.guadou.lib_baselib.utils.CommUtils
+import com.guadou.lib_baselib.utils.KeyboardUtils
+import com.hongyegroup.cpt_newsfeed.BR
+import com.hongyegroup.cpt_newsfeed.R
+import com.hongyegroup.cpt_newsfeed.databinding.ActivityNewsfeedFollowsBinding
+import com.hongyegroup.cpt_newsfeed.mvvm.NewsFeedFollowsViewModel
+import dagger.hilt.android.AndroidEntryPoint
+
+/**
+ * 动态中关注与被关注的ViewPager
+ */
+@AndroidEntryPoint
+class NewsFeedFollowsActivity : YYBaseVDBActivity<NewsFeedFollowsViewModel, ActivityNewsfeedFollowsBinding>() {
+
+    companion object {
+        fun startInstance() {
+            val context = CommUtils.getContext()
+            val intent = Intent(context, NewsFeedFollowsActivity::class.java)
+            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+            context.startActivity(intent)
+        }
+    }
+
+    override fun getDataBindingConfig(): DataBindingConfig {
+        return DataBindingConfig(R.layout.activity_newsfeed_follows, BR.viewModel, mViewModel)
+            .addBindingParams(BR.click, ClickProxy())
+    }
+
+    override fun init(savedInstanceState: Bundle?) {
+        setStatusBarBlackText()
+    }
+
+    override fun startObserve() {
+
+    }
+
+    /**
+     * DataBinding事件处理
+     */
+    inner class ClickProxy {
+
+        fun selectCountryCode() {
+            KeyboardUtils.hideSoftInput(mActivity)
+        }
+
+    }
+}

+ 106 - 0
cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/ui/NewsFeedListFragment.kt

@@ -0,0 +1,106 @@
+package com.hongyegroup.cpt_newsfeed.ui
+
+import android.os.Bundle
+import android.view.View
+import com.chad.library.adapter.base.listener.OnLoadMoreListener
+import com.guadou.cs_cptservices.base.fragment.YYBaseVDBLazyLoadingFragment
+import com.guadou.cs_cptservices.interfaces.IFragmentRefresh
+import com.guadou.lib_baselib.bean.DataBindingConfig
+import com.guadou.lib_baselib.engine.toast
+import com.guadou.lib_baselib.ext.vertical
+import com.guadou.lib_baselib.utils.log.YYLogUtils
+import com.guadou.lib_baselib.view.gloading.Gloading
+import com.guadou.lib_baselib.view.gloading.GloadingPlaceHolderlAdapter
+import com.hongyegroup.cpt_newsfeed.R
+import com.hongyegroup.cpt_newsfeed.databinding.FragmentNewsfeedFollowingBinding
+import com.hongyegroup.cpt_newsfeed.mvvm.NewsFeedFollowingViewModel
+import com.scwang.smart.refresh.layout.api.RefreshLayout
+import com.scwang.smart.refresh.layout.listener.OnRefreshListener
+
+/**
+ * 多类型的动态列表页面
+ */
+class NewsFeedListFragment(private val type: Int) : YYBaseVDBLazyLoadingFragment<NewsFeedFollowingViewModel, FragmentNewsfeedFollowingBinding>(),
+    IFragmentRefresh, OnRefreshListener, OnLoadMoreListener {
+
+    override fun getDataBindingConfig(): DataBindingConfig {
+        return DataBindingConfig(R.layout.fragment_newsfeed_following)
+    }
+
+    //重新生成GLoading对象
+    override fun generateGLoading(view: View): Gloading.Holder {
+        return Gloading.from(GloadingPlaceHolderlAdapter(R.layout.layout_placeholder_newsfeed_hot)).wrap(view)
+            .withRetry { onLazyInitData() }
+    }
+
+    override fun init(savedInstanceState: Bundle?) {
+        initRV()
+        initListener()
+    }
+
+    override fun onLazyInitData() {
+        YYLogUtils.w("onLazyInitData-1")
+        initData()
+    }
+
+    private fun initData() {
+        mViewModel.getNewsFeedList().observe(this) {
+            mBinding.refreshLayout.finishRefresh()
+            mViewModel.mAdapter.loadMoreModule.isEnableLoadMore = true
+        }
+    }
+
+    private fun initListener() {
+        //Adapter的滑动监听,监听加载更多
+        mViewModel.mAdapter.loadMoreModule.isEnableLoadMore = false
+        mViewModel.mAdapter.loadMoreModule.preLoadNumber = 4
+        mViewModel.mAdapter.loadMoreModule.setOnLoadMoreListener(this)
+
+        //刷新控件初始化
+        mBinding.refreshLayout.setEnableNestedScroll(true)
+        mBinding.refreshLayout.setEnableLoadMore(false)
+        mBinding.refreshLayout.setEnableRefresh(true)
+        mBinding.refreshLayout.setOnRefreshListener(this)
+
+        //Item点击
+        mViewModel.mAdapter.addChildClickViewIds(R.id.ll_news_feed_root)
+        mViewModel.mAdapter.setOnItemChildClickListener { _, _, position ->
+            val item = mViewModel.mDatas[position]
+            toast("点击Item")
+        }
+    }
+
+    override fun onRefresh(refreshLayout: RefreshLayout) {
+        mViewModel.isNeedCleanAllData = true
+        mViewModel.mAdapter.loadMoreModule.loadMoreComplete()
+        mViewModel.mAdapter.loadMoreModule.isEnableLoadMore = false
+        //直接调用,参数从成员变量中获取
+        mViewModel.mCurPage = 1
+        initData()
+    }
+
+    override fun onLoadMore() {
+        mViewModel.isNeedCleanAllData = false
+        mViewModel.mCurPage++
+        initData()
+    }
+
+    private fun initRV() {
+        mBinding.recyclerView.vertical().apply {
+            adapter = mViewModel.mAdapter
+        }
+    }
+
+    override fun scrollTopRefresh() {
+        if (mViewModel.mDatas.size > 1) {
+            mBinding.recyclerView.scrollToPosition(0)
+        }
+        mBinding.refreshLayout.autoRefresh()
+    }
+
+
+    override fun startObserve() {
+
+    }
+
+}

+ 154 - 0
cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/ui/NewsFeedMainFragment.kt

@@ -0,0 +1,154 @@
+package com.hongyegroup.cpt_newsfeed.ui
+
+import android.content.Intent
+import android.os.Bundle
+import android.view.View
+import androidx.viewpager.widget.ViewPager
+import com.guadou.cs_cptservices.base.fragment.YYBaseVDBFragment
+import com.guadou.cs_cptservices.interfaces.IFragmentRefresh
+import com.guadou.lib_baselib.base.Ghost
+import com.guadou.lib_baselib.bean.DataBindingConfig
+import com.guadou.lib_baselib.engine.toast
+import com.guadou.lib_baselib.ext.bindFragment
+import com.guadou.lib_baselib.utils.CommUtils
+import com.hongyegroup.cpt_newsfeed.BR
+import com.hongyegroup.cpt_newsfeed.R
+import com.hongyegroup.cpt_newsfeed.databinding.FragmentNewsfeedMainBinding
+import com.hongyegroup.cpt_newsfeed.mvvm.NewsFeedMainViewModel
+
+/**
+ * 首页动态广场的页面
+ * Tab + ViewPager
+ */
+class NewsFeedMainFragment : YYBaseVDBFragment<NewsFeedMainViewModel, FragmentNewsfeedMainBinding>(), IFragmentRefresh {
+
+    private var mCurPage = 1
+    private lateinit var mNewsFeedMonentsFragment: NewsFeedListFragment
+    private lateinit var mNewsFeedFollowingFragment: NewsFeedListFragment
+    private lateinit var mNewsFeedProfileFragment: NewsFeedProfileFragment
+
+    override fun getDataBindingConfig(): DataBindingConfig {
+        return DataBindingConfig(R.layout.fragment_newsfeed_main, BR.viewModel, mViewModel)
+            .addBindingParams(BR.click, ClickProxy())
+    }
+
+    override fun startObserve() {
+    }
+
+    override fun init(savedInstanceState: Bundle?) {
+        setStatusBarBlackText()
+
+        initAdapter()
+    }
+
+    private fun initAdapter() {
+        mNewsFeedMonentsFragment = NewsFeedListFragment(0)
+        mNewsFeedFollowingFragment = NewsFeedListFragment(1)
+        mNewsFeedProfileFragment = NewsFeedProfileFragment("8558", true)
+
+        mViewModel.mFragments.add(mNewsFeedMonentsFragment)
+        mViewModel.mFragments.add(mNewsFeedFollowingFragment)
+        mViewModel.mFragments.add(mNewsFeedProfileFragment)
+
+        mBinding.viewPager.bindFragment(childFragmentManager, mViewModel.mFragments)
+
+        mBinding.viewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
+            override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {}
+            override fun onPageScrollStateChanged(state: Int) {}
+            override fun onPageSelected(position: Int) {
+                mCurPage = position
+                setIndicator(position)
+            }
+        })
+
+        mBinding.viewPager.currentItem = 1
+    }
+
+    //点击顶部选择切换ViewPager的效果
+    private fun setCurrentPage(index: Int) {
+        mBinding.viewPager.currentItem = index
+        setIndicator(index)
+    }
+
+    //滑动ViewPager切换顶部选择的效果
+    private fun setIndicator(position: Int) {
+        mCurPage = position
+        when (position) {
+            0 -> {
+                mBinding.textMoments.setTextColor(CommUtils.getColor(R.color.app_blue))
+                mBinding.viewFollowLine.visibility = View.VISIBLE
+                mBinding.textFollowing.setTextColor(CommUtils.getColor(R.color.gray_88))
+                mBinding.viewForYouLine.visibility = View.GONE
+                mBinding.textPulished.setTextColor(CommUtils.getColor(R.color.gray_88))
+                mBinding.viewPublished.visibility = View.GONE
+            }
+            1 -> {
+                mBinding.textMoments.setTextColor(CommUtils.getColor(R.color.gray_88))
+                mBinding.viewFollowLine.visibility = View.GONE
+                mBinding.textFollowing.setTextColor(CommUtils.getColor(R.color.app_blue))
+                mBinding.viewForYouLine.visibility = View.VISIBLE
+                mBinding.textPulished.setTextColor(CommUtils.getColor(R.color.gray_88))
+                mBinding.viewPublished.visibility = View.GONE
+            }
+            else -> {
+                mBinding.textMoments.setTextColor(CommUtils.getColor(R.color.gray_88))
+                mBinding.viewFollowLine.visibility = View.GONE
+                mBinding.textFollowing.setTextColor(CommUtils.getColor(R.color.gray_88))
+                mBinding.viewForYouLine.visibility = View.GONE
+                mBinding.textPulished.setTextColor(CommUtils.getColor(R.color.app_blue))
+                mBinding.viewPublished.visibility = View.VISIBLE
+            }
+        }
+    }
+
+    override fun scrollTopRefresh() {
+        when (mCurPage) {
+            0 -> mNewsFeedMonentsFragment.scrollTopRefresh()
+            1 -> mNewsFeedFollowingFragment.scrollTopRefresh()
+            else -> mNewsFeedProfileFragment.scrollTopRefresh()
+        }
+    }
+
+    /**
+     * DataBinding事件处理
+     */
+    inner class ClickProxy {
+
+        //切换到朋友圈
+        fun switchMoments() {
+            if (mCurPage == 0) {
+                mNewsFeedMonentsFragment.scrollTopRefresh()
+            } else {
+                setCurrentPage(0)
+            }
+        }
+
+        //切换已关注的
+        fun switchFollowing() {
+            if (mCurPage == 1) {
+                mNewsFeedFollowingFragment.scrollTopRefresh()
+            } else {
+                setCurrentPage(1)
+            }
+        }
+
+        //切换我的发布
+        fun switchPulished() {
+            if (mCurPage == 2) {
+                mNewsFeedProfileFragment.scrollTopRefresh()
+            } else {
+                setCurrentPage(2)
+            }
+        }
+
+        //去发布页面
+        fun gotoPostPage() {
+            Ghost.launchActivityForResult(mActivity, Intent(mActivity, NewsFeedPostActivity::class.java)) {
+                val name = it?.getStringExtra("name")
+                toast("获取回调 name:" + name)
+            }
+        }
+
+    }
+
+}

+ 59 - 0
cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/ui/NewsFeedPostActivity.kt

@@ -0,0 +1,59 @@
+package com.hongyegroup.cpt_newsfeed.ui
+
+import android.content.Intent
+import android.os.Bundle
+import com.guadou.cs_cptservices.base.activity.YYBaseVDBActivity
+import com.guadou.lib_baselib.bean.DataBindingConfig
+import com.guadou.lib_baselib.utils.CommUtils
+import com.guadou.lib_baselib.utils.KeyboardUtils
+import com.hongyegroup.cpt_newsfeed.BR
+import com.hongyegroup.cpt_newsfeed.R
+import com.hongyegroup.cpt_newsfeed.databinding.ActivityNewsfeedPostBinding
+import com.hongyegroup.cpt_newsfeed.mvvm.NewsFeedPostViewModel
+import dagger.hilt.android.AndroidEntryPoint
+
+/**
+ * 动态发布页面
+ */
+@AndroidEntryPoint
+class NewsFeedPostActivity : YYBaseVDBActivity<NewsFeedPostViewModel, ActivityNewsfeedPostBinding>() {
+
+    companion object {
+        fun startInstance() {
+            val context = CommUtils.getContext()
+            val intent = Intent(context, NewsFeedPostActivity::class.java)
+            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+            context.startActivity(intent)
+        }
+    }
+
+    override fun getDataBindingConfig(): DataBindingConfig {
+        return DataBindingConfig(R.layout.activity_newsfeed_post, BR.viewModel, mViewModel)
+            .addBindingParams(BR.click, ClickProxy())
+    }
+
+    override fun init(savedInstanceState: Bundle?) {
+        setStatusBarBlackText()
+    }
+
+    override fun startObserve() {
+
+    }
+
+    /**
+     * DataBinding事件处理
+     */
+    inner class ClickProxy {
+
+        fun selectCountryCode() {
+            KeyboardUtils.hideSoftInput(mActivity)
+
+            setResult(-1, Intent().apply {
+                putExtra("name", "zhangsan")
+            })
+
+            finish()
+        }
+
+    }
+}

+ 50 - 0
cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/ui/NewsFeedProfileActivity.kt

@@ -0,0 +1,50 @@
+package com.hongyegroup.cpt_newsfeed.ui
+
+import android.content.Intent
+import android.os.Bundle
+import com.guadou.lib_baselib.base.activity.BaseVMActivity
+import com.guadou.lib_baselib.base.vm.EmptyViewModel
+import com.guadou.lib_baselib.utils.CommUtils
+import com.hongyegroup.cpt_newsfeed.R
+
+/**
+ * 个人的主页 实际上为空容器
+ * 内部加载Fragment实现
+ */
+class NewsFeedProfileActivity : BaseVMActivity<EmptyViewModel>() {
+
+    private var mMemberId: String? = null
+    private var isSelf: Boolean = false
+    private lateinit var mNewsFeedProfileFragment: NewsFeedProfileFragment
+
+    companion object {
+        fun startInstance(memberId: String, isSelf: Boolean = false) {
+            val context = CommUtils.getContext()
+            val intent = Intent(context, NewsFeedProfileActivity::class.java)
+            intent.putExtra("memberId", memberId)
+            intent.putExtra("isSelf", isSelf)
+            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+            context.startActivity(intent)
+        }
+    }
+
+    override fun getDataFromIntent(intent: Intent) {
+        mMemberId = intent.getStringExtra("memberId")
+        isSelf = intent.getBooleanExtra("isSelf", false)
+    }
+
+    override fun getLayoutIdRes(): Int = R.layout.activity_newsfeed_profile
+
+    override fun init(savedInstanceState: Bundle?) {
+        mNewsFeedProfileFragment = NewsFeedProfileFragment(mMemberId,isSelf)
+
+        supportFragmentManager.beginTransaction()
+            .add(R.id.fragment_container, mNewsFeedProfileFragment)
+            .commitAllowingStateLoss()
+    }
+
+    override fun startObserve() {
+
+    }
+
+}

+ 50 - 0
cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/ui/NewsFeedProfileFragment.kt

@@ -0,0 +1,50 @@
+package com.hongyegroup.cpt_newsfeed.ui
+
+import android.os.Bundle
+import com.guadou.cs_cptservices.base.fragment.YYBaseVDBLazyLoadingFragment
+import com.guadou.lib_baselib.bean.DataBindingConfig
+import com.guadou.lib_baselib.utils.KeyboardUtils
+import com.hongyegroup.cpt_newsfeed.BR
+import com.hongyegroup.cpt_newsfeed.R
+import com.hongyegroup.cpt_newsfeed.databinding.FragmentNewsfeedProfileBinding
+import com.hongyegroup.cpt_newsfeed.mvvm.NewsFeedProfileViewModel
+
+/**
+ * 我的发布 个人主页 同一个页面
+ */
+class NewsFeedProfileFragment(
+    private val mMemberId: String?, private val isSelf: Boolean
+) : YYBaseVDBLazyLoadingFragment<NewsFeedProfileViewModel, FragmentNewsfeedProfileBinding>() {
+
+    override fun getDataBindingConfig(): DataBindingConfig {
+        return DataBindingConfig(R.layout.fragment_newsfeed_profile, BR.viewModel, mViewModel)
+            .addBindingParams(BR.click, ClickProxy())
+    }
+
+    override fun init(savedInstanceState: Bundle?) {
+    }
+
+    override fun onLazyInitData() {
+
+    }
+
+    override fun startObserve() {
+
+    }
+
+    fun scrollTopRefresh() {
+
+    }
+
+    /**
+     * DataBinding事件处理
+     */
+    inner class ClickProxy {
+
+        fun selectCountryCode() {
+            KeyboardUtils.hideSoftInput(mActivity)
+        }
+
+    }
+
+}

+ 39 - 0
cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/widget/expand/ButtonSpan.java

@@ -0,0 +1,39 @@
+package com.hongyegroup.cpt_newsfeed.widget.expand;
+
+import android.content.Context;
+import android.text.TextPaint;
+import android.text.style.ClickableSpan;
+import android.view.View;
+
+import com.hongyegroup.cpt_newsfeed.R;
+
+
+public class ButtonSpan extends ClickableSpan {
+
+    View.OnClickListener onClickListener;
+    private Context context;
+    private int colorId;
+
+    public ButtonSpan(Context context, View.OnClickListener onClickListener) {
+        this(context, onClickListener, R.color.app_blue);
+    }
+
+    public ButtonSpan(Context context, View.OnClickListener onClickListener, int colorId) {
+        this.onClickListener = onClickListener;
+        this.context = context;
+        this.colorId = colorId;
+    }
+
+    @Override
+    public void updateDrawState(TextPaint ds) {
+        ds.setColor(context.getResources().getColor(colorId));
+        ds.setUnderlineText(false);
+    }
+
+    @Override
+    public void onClick(View widget) {
+        if (onClickListener != null) {
+            onClickListener.onClick(widget);
+        }
+    }
+}

+ 279 - 0
cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/widget/expand/ExpandTextView.java

@@ -0,0 +1,279 @@
+package com.hongyegroup.cpt_newsfeed.widget.expand;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.text.Layout;
+import android.text.Spannable;
+import android.text.SpannableString;
+import android.text.SpannableStringBuilder;
+import android.text.Spanned;
+import android.text.StaticLayout;
+import android.text.method.LinkMovementMethod;
+import android.text.style.URLSpan;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.view.View;
+
+import androidx.appcompat.widget.AppCompatTextView;
+
+import com.guadou.lib_baselib.font_text_view.TypefaceUtil;
+import com.guadou.lib_baselib.utils.CommUtils;
+import com.hongyegroup.cpt_newsfeed.R;
+
+
+/**
+ * 折叠展开的TextView
+ */
+public class ExpandTextView extends AppCompatTextView {
+
+    private CharSequence originText;// 原始内容文本
+    private int initWidth = 0;// TextView可展示宽度
+    private int mMaxLines = 3;// TextView最大行数
+    private SpannableString SPAN_CLOSE = null;// 收起的文案(颜色处理)
+    private SpannableString SPAN_EXPAND = null;// 展开的文案(颜色处理)
+    private String TEXT_EXPAND = "  [更多]";
+    private String TEXT_CLOSE = "  [收起]";
+    private boolean isLongClick = false;
+
+    public ExpandTextView(Context context) {
+        super(context);
+        initCloseEnd();
+    }
+
+    public ExpandTextView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        initCloseEnd();
+    }
+
+    public ExpandTextView(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+        initCloseEnd();
+    }
+
+    /**
+     * 设置TextView可显示的最大行数
+     *
+     * @param maxLines 最大行数
+     */
+    @Override
+    public void setMaxLines(int maxLines) {
+        this.mMaxLines = maxLines;
+        super.setMaxLines(maxLines);
+    }
+
+    /**
+     * 初始化TextView的可展示宽度
+     *
+     * @param width
+     */
+    public void initWidth(int width) {
+        initWidth = width;
+    }
+
+    /**
+     * 收起的文案(颜色处理)初始化
+     */
+    private void initCloseEnd() {
+        //设置展开的文本
+        SPAN_CLOSE = new SpannableString(TEXT_EXPAND);
+
+        ButtonSpan span = new ButtonSpan(getContext(), new OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                ExpandTextView.super.setMaxLines(Integer.MAX_VALUE);
+                setExpandText(originText);
+                if (mCallback != null) mCallback.isExpand(1);
+            }
+        }, R.color.app_blue);
+
+        SPAN_CLOSE.setSpan(span, 0, TEXT_EXPAND.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
+        SPAN_CLOSE.setSpan(new MyTypefaceSpan(TypefaceUtil.getMedium()), 0, TEXT_EXPAND.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
+    }
+
+    /**
+     * 展开的文案(颜色处理)初始化
+     */
+    private void initExpandEnd() {
+        //设置关闭的文本
+        SPAN_EXPAND = new SpannableString(TEXT_CLOSE);
+        ButtonSpan span = new ButtonSpan(getContext(), new OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                ExpandTextView.super.setMaxLines(mMaxLines);
+                setCloseText(originText);
+                if (mCallback != null) mCallback.isExpand(0);
+            }
+        }, R.color.app_blue);
+
+        SPAN_EXPAND.setSpan(span, 0, TEXT_CLOSE.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
+        SPAN_EXPAND.setSpan(new MyTypefaceSpan(TypefaceUtil.getMedium()), 0, TEXT_CLOSE.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
+    }
+
+    /**
+     * 默认设置文本方法
+     */
+    public void setCloseText(CharSequence text) {
+
+        if (SPAN_CLOSE == null) {
+            initCloseEnd();
+        }
+        boolean appendShowAll = false;// true 不需要展开收起功能, false 需要展开收起功能
+        originText = text;
+
+        // SDK >= 16 可以直接从xml属性获取最大行数
+        int maxLines = 0;
+        maxLines = getMaxLines();
+//        StringBuilder workingTextBuilder = new StringBuilder(originText);
+        CharSequence workingText = originText;
+        if (maxLines != -1) {
+            Layout layout = createWorkingLayout(workingText);
+            if (layout.getLineCount() > maxLines) {
+                //获取一行显示字符个数,然后截取字符串数
+                workingText = originText.subSequence(0, layout.getLineEnd(maxLines - 1));// 收起状态原始文本截取展示的部分
+
+                String showText = originText.subSequence(0, layout.getLineEnd(maxLines - 1)) + "..." + SPAN_CLOSE;
+                Layout layout2 = createWorkingLayout(showText);
+
+                // 对workingText进行-1截取,直到展示行数==最大行数,并且添加 SPAN_CLOSE 后刚好占满最后一行
+                while (layout2.getLineCount() > maxLines) {
+                    int lastSpace = workingText.length() - 1;
+                    if (lastSpace == -1) {
+                        break;
+                    }
+                    workingText = workingText.subSequence(0, lastSpace);
+                    layout2 = createWorkingLayout(workingText + "..." + SPAN_CLOSE);
+                }
+
+                appendShowAll = true;
+
+            }
+        }
+
+        setText(workingText);
+
+        if (appendShowAll) {
+            // 必须使用append,不能在上面使用+连接,否则spannable会无效
+            append("...");
+            append(SPAN_CLOSE);
+        }
+
+        setMovementMethod(LinkMovementMethod.getInstance());
+
+        replaceUrlSpan();
+    }
+
+    /**
+     * 展开
+     */
+    private void setExpandText(CharSequence text) {
+        if (SPAN_EXPAND == null) {
+            initExpandEnd();
+        }
+        Layout layout1 = createWorkingLayout(text);
+        Layout layout2 = createWorkingLayout(text + TEXT_CLOSE);
+        // 展示全部原始内容时 如果 TEXT_CLOSE 需要换行才能显示完整,则直接将TEXT_CLOSE展示在下一行
+        if (layout2.getLineCount() > layout1.getLineCount()) {
+            setText(originText + "\n");
+        } else {
+            setText(originText);
+        }
+        append(SPAN_EXPAND);
+
+        setMovementMethod(LinkMovementMethod.getInstance());
+
+        replaceUrlSpan();
+    }
+
+    /**
+     * 填充文本之后尝试替换URLSpan
+     */
+    private void replaceUrlSpan() {
+        CharSequence text = getText();
+        if (text instanceof Spannable) {
+            int end = text.length();
+            Spannable sp = (Spannable) text;
+
+            URLSpan[] urls = sp.getSpans(0, end, URLSpan.class);
+            SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(text);
+
+            if (urls.length > 0) {
+                for (URLSpan urlSpan : urls) {
+                    //拦截点击,替换Span
+                    InterceptUrlSpan interceptUrlSpan = new InterceptUrlSpan(urlSpan.getURL());
+                    spannableStringBuilder.setSpan(interceptUrlSpan, sp.getSpanStart(urlSpan), sp.getSpanEnd(urlSpan), Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
+                }
+
+                //替换之后重新设置进去
+                setText(spannableStringBuilder);
+            }
+
+        }
+    }
+
+    /**
+     * 展示全部的文本
+     */
+    public void showAllText() {
+        ExpandTextView.super.setMaxLines(Integer.MAX_VALUE);
+        setExpandText(originText);
+    }
+
+    /**
+     * 展示收缩文本
+     */
+    public void showExpandText() {
+        ExpandTextView.super.setMaxLines(mMaxLines);
+        setCloseText(originText);
+    }
+
+    //返回textview的显示区域的layout,该textview的layout并不会显示出来,只是用其宽度来比较要显示的文字是否过长
+    private Layout createWorkingLayout(CharSequence workingText) {
+        return new StaticLayout(workingText, getPaint(), initWidth - getPaddingLeft() - getPaddingRight(),
+                Layout.Alignment.ALIGN_NORMAL, getLineSpacingMultiplier(), getLineSpacingExtra(), false);
+    }
+
+
+    private OnExpandCallback mCallback;
+
+    public void setOnExpandCallback(OnExpandCallback callback) {
+        mCallback = callback;
+    }
+
+    /**
+     * 回调,展开和收缩的状态回调
+     */
+    public interface OnExpandCallback {
+        void isExpand(int status); //0为收缩  1是展开
+    }
+
+
+    @SuppressLint("ClickableViewAccessibility")
+    @Override
+    public boolean onTouchEvent(MotionEvent event) {
+
+        if (isLongClick) {
+            setBackgroundColor(CommUtils.getColor(R.color.gray));
+        } else {
+            setBackgroundColor(CommUtils.getColor(R.color.white));
+        }
+
+        if (event.getAction() == MotionEvent.ACTION_DOWN) {
+
+        } else if (event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL) {
+
+            if (isLongClick) {
+                setBackgroundColor(CommUtils.getColor(R.color.gray));
+            } else {
+                setBackgroundColor(CommUtils.getColor(R.color.white));
+            }
+            isLongClick = false;
+        }
+
+        return super.onTouchEvent(event);
+    }
+
+
+    public void setLongClick(boolean longClick) {
+        isLongClick = longClick;
+    }
+}

+ 25 - 0
cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/widget/expand/InterceptUrlSpan.kt

@@ -0,0 +1,25 @@
+package com.hongyegroup.cpt_newsfeed.widget.expand
+
+import android.text.style.ClickableSpan
+import android.view.View
+import com.guadou.cs_cptservices.ui.GlobalWebActivity
+import com.guadou.lib_baselib.utils.log.YYLogUtils
+
+
+class InterceptUrlSpan(private val url: String) : ClickableSpan() {
+
+    var _viewClickFlag = false
+    val _clickRunnable = Runnable { _viewClickFlag = false }
+
+    override fun onClick(widget: View) {
+
+        if (!_viewClickFlag) {
+            _viewClickFlag = true
+            YYLogUtils.w("自定义的点击$url")
+            GlobalWebActivity.startInstance("", url)
+        }
+        widget.removeCallbacks(_clickRunnable)
+        widget.postDelayed(_clickRunnable, 350)
+
+    }
+}

+ 43 - 0
cpt_newsfeed/src/main/java/com/hongyegroup/cpt_newsfeed/widget/expand/MyTypefaceSpan.java

@@ -0,0 +1,43 @@
+package com.hongyegroup.cpt_newsfeed.widget.expand;
+
+import android.graphics.Paint;
+import android.graphics.Typeface;
+import android.text.TextPaint;
+import android.text.style.MetricAffectingSpan;
+
+/**
+ * 系统原生的TypefaceSpan只能使用原生的默认字体
+ * 如果使用自定义的字体,通过这个来实现
+ */
+public class MyTypefaceSpan extends MetricAffectingSpan {
+
+    private final Typeface typeface;
+
+    public MyTypefaceSpan(final Typeface typeface) {
+        this.typeface = typeface;
+    }
+
+    @Override
+    public void updateDrawState(final TextPaint drawState) {
+        apply(drawState);
+    }
+
+    @Override
+    public void updateMeasureState(final TextPaint paint) {
+        apply(paint);
+    }
+
+    private void apply(final Paint paint) {
+        final Typeface oldTypeface = paint.getTypeface();
+        final int oldStyle = oldTypeface != null ? oldTypeface.getStyle() : 0;
+        int fakeStyle = oldStyle & ~typeface.getStyle();
+        if ((fakeStyle & Typeface.BOLD) != 0) {
+            paint.setFakeBoldText(true);
+        }
+        if ((fakeStyle & Typeface.ITALIC) != 0) {
+            paint.setTextSkewX(-0.25f);
+        }
+        paint.setTypeface(typeface);
+    }
+
+}

BIN
cpt_newsfeed/src/main/res/drawable-xxhdpi/news_feed_camera.webp


BIN
cpt_newsfeed/src/main/res/drawable-xxhdpi/news_feed_comments_un.webp


BIN
cpt_newsfeed/src/main/res/drawable-xxhdpi/news_feed_likes_un.webp


BIN
cpt_newsfeed/src/main/res/drawable-xxhdpi/news_feed_share_un.webp


BIN
cpt_newsfeed/src/main/res/drawable-xxhdpi/newsfeed_profile_news_addfollow_red.webp


BIN
cpt_newsfeed/src/main/res/drawable-xxhdpi/newsfeed_profile_news_followed.webp


+ 5 - 0
cpt_newsfeed/src/main/res/drawable/shape_news_feed_follow_red_round_18.xml

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

+ 36 - 0
cpt_newsfeed/src/main/res/layout/activity_newsfeed_detail.xml

@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:binding="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    tools:ignore="RtlHardcoded">
+
+    <data>
+
+        <variable
+            name="viewModel"
+            type="com.hongyegroup.cpt_newsfeed.mvvm.NewsFeedDetailViewModel" />
+
+        <variable
+            name="click"
+            type="com.hongyegroup.cpt_newsfeed.ui.NewsFeedDetailActivity.ClickProxy" />
+
+    </data>
+
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="@color/white"
+        android:orientation="vertical">
+
+
+        <TextView
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:gravity="center"
+            android:text="NewsFeed" />
+
+    </LinearLayout>
+
+</layout>

+ 36 - 0
cpt_newsfeed/src/main/res/layout/activity_newsfeed_follows.xml

@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:binding="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    tools:ignore="RtlHardcoded">
+
+    <data>
+
+        <variable
+            name="viewModel"
+            type="com.hongyegroup.cpt_newsfeed.mvvm.NewsFeedFollowsViewModel" />
+
+        <variable
+            name="click"
+            type="com.hongyegroup.cpt_newsfeed.ui.NewsFeedFollowsActivity.ClickProxy" />
+
+    </data>
+
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="@color/white"
+        android:orientation="vertical">
+
+
+        <TextView
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:gravity="center"
+            android:text="NewsFeed" />
+
+    </LinearLayout>
+
+</layout>

+ 37 - 0
cpt_newsfeed/src/main/res/layout/activity_newsfeed_post.xml

@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:binding="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    tools:ignore="RtlHardcoded">
+
+    <data>
+
+        <variable
+            name="viewModel"
+            type="com.hongyegroup.cpt_newsfeed.mvvm.NewsFeedPostViewModel" />
+
+        <variable
+            name="click"
+            type="com.hongyegroup.cpt_newsfeed.ui.NewsFeedPostActivity.ClickProxy" />
+
+    </data>
+
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="@color/white"
+        android:orientation="vertical">
+
+
+        <TextView
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:gravity="center"
+            android:text="NewsFeed"
+            binding:clicks="@{click.selectCountryCode}" />
+
+    </LinearLayout>
+
+</layout>

+ 9 - 0
cpt_newsfeed/src/main/res/layout/activity_newsfeed_profile.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    tools:viewBindingIgnore="true"
+    android:id="@+id/fragment_container"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+</FrameLayout>

+ 34 - 0
cpt_newsfeed/src/main/res/layout/fragment_newsfeed_fans.xml

@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:binding="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    tools:ignore="RtlHardcoded">
+
+    <data>
+
+        <variable
+            name="viewModel"
+            type="com.hongyegroup.cpt_newsfeed.mvvm.NewsFeedFansViewModel" />
+
+        <variable
+            name="click"
+            type="com.hongyegroup.cpt_newsfeed.ui.NewsFeedFansFragment.ClickProxy" />
+
+        <import type="android.text.TextUtils" />
+
+    </data>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="#3684F9"
+        android:orientation="vertical">
+
+        <com.guadou.lib_baselib.view.titlebar.StatusbarGrayView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content" />
+
+    </LinearLayout>
+
+</layout>

+ 34 - 0
cpt_newsfeed/src/main/res/layout/fragment_newsfeed_follow.xml

@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:binding="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    tools:ignore="RtlHardcoded">
+
+    <data>
+
+        <variable
+            name="viewModel"
+            type="com.hongyegroup.cpt_newsfeed.mvvm.NewsFeedFollowViewModel" />
+
+        <variable
+            name="click"
+            type="com.hongyegroup.cpt_newsfeed.ui.NewsFeedFollowFragment.ClickProxy" />
+
+        <import type="android.text.TextUtils" />
+
+    </data>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="#3684F9"
+        android:orientation="vertical">
+
+        <com.guadou.lib_baselib.view.titlebar.StatusbarGrayView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content" />
+
+    </LinearLayout>
+
+</layout>

+ 37 - 0
cpt_newsfeed/src/main/res/layout/fragment_newsfeed_following.xml

@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:binding="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    tools:ignore="RtlHardcoded">
+
+    <data>
+
+    </data>
+
+    <com.scwang.smart.refresh.layout.SmartRefreshLayout
+        android:id="@+id/refresh_layout"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:focusable="true"
+        android:focusableInTouchMode="true"
+        app:srlEnablePreviewInEditMode="false"
+        app:srlPrimaryColor="@color/white">
+
+        <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:overScrollMode="never"
+            android:scrollbars="none">
+
+        </androidx.recyclerview.widget.RecyclerView>
+
+
+    </com.scwang.smart.refresh.layout.SmartRefreshLayout>
+
+</layout>

+ 185 - 0
cpt_newsfeed/src/main/res/layout/fragment_newsfeed_main.xml

@@ -0,0 +1,185 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:binding="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    tools:ignore="RtlHardcoded">
+
+    <data>
+
+        <variable
+            name="viewModel"
+            type="com.hongyegroup.cpt_newsfeed.mvvm.NewsFeedMainViewModel" />
+
+        <variable
+            name="click"
+            type="com.hongyegroup.cpt_newsfeed.ui.NewsFeedMainFragment.ClickProxy" />
+
+    </data>
+
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="@color/white"
+        android:orientation="vertical">
+
+        <com.guadou.lib_baselib.view.titlebar.StatusbarGrayView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content" />
+
+        <androidx.constraintlayout.widget.ConstraintLayout
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_46dp"
+            android:paddingLeft="@dimen/d_40dp"
+            android:paddingRight="@dimen/d_40dp">
+
+            <com.guadou.lib_baselib.font_text_view.TextViewBold
+                android:id="@+id/text_moments"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:onClick="@{()->click.switchMoments()}"
+                android:text="朋友圈"
+                android:textColor="@color/gray_88"
+                android:textSize="@dimen/d_16sp"
+                app:layout_constraintBottom_toBottomOf="parent"
+                app:layout_constraintLeft_toLeftOf="parent"
+                app:layout_constraintRight_toLeftOf="@id/text_following"
+                app:layout_constraintTop_toTopOf="parent" />
+
+            <View
+                android:id="@+id/view_follow_line"
+                android:layout_width="0dp"
+                android:layout_height="2.5dp"
+                android:background="@drawable/shape_blue_round3"
+                android:visibility="gone"
+                app:layout_constraintBottom_toBottomOf="parent"
+                app:layout_constraintLeft_toLeftOf="@id/text_moments"
+                app:layout_constraintRight_toRightOf="@id/text_moments" />
+
+            <com.guadou.lib_baselib.font_text_view.TextViewBold
+                android:id="@+id/text_following"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:onClick="@{()->click.switchFollowing()}"
+                android:text="已关注"
+                android:textColor="@color/app_blue"
+                android:textSize="@dimen/d_16sp"
+                app:layout_constraintBottom_toBottomOf="parent"
+                app:layout_constraintLeft_toRightOf="@id/text_moments"
+                app:layout_constraintRight_toLeftOf="@id/text_pulished"
+                app:layout_constraintTop_toTopOf="parent" />
+
+            <!--  已关注的数量    -->
+            <com.guadou.lib_baselib.font_text_view.TextViewBold
+                android:layout_width="18dp"
+                android:layout_height="11.5dp"
+                android:background="@drawable/unread_red_bg"
+                android:gravity="center"
+                android:text="9"
+                android:textColor="@color/white"
+                android:textSize="@dimen/d_9sp"
+                app:layout_constraintBottom_toTopOf="@id/text_following"
+                app:layout_constraintLeft_toRightOf="@id/text_following"
+                app:layout_constraintRight_toRightOf="@id/text_following"
+                app:layout_constraintTop_toTopOf="@id/text_following" />
+
+            <View
+                android:id="@+id/view_for_you_line"
+                android:layout_width="0dp"
+                android:layout_height="2.5dp"
+                android:background="@drawable/shape_blue_round3"
+                android:visibility="visible"
+                app:layout_constraintBottom_toBottomOf="parent"
+                app:layout_constraintLeft_toLeftOf="@id/text_following"
+                app:layout_constraintRight_toRightOf="@id/text_following" />
+
+            <com.guadou.lib_baselib.font_text_view.TextViewBold
+                android:id="@+id/text_pulished"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:onClick="@{()->click.switchPulished()}"
+                android:text="我的发布"
+                android:textColor="@color/gray_88"
+                android:textSize="@dimen/d_16sp"
+                app:layout_constraintBottom_toBottomOf="parent"
+                app:layout_constraintLeft_toRightOf="@id/text_following"
+                app:layout_constraintRight_toRightOf="parent"
+                app:layout_constraintTop_toTopOf="parent" />
+
+            <View
+                android:id="@+id/view_published"
+                android:layout_width="0dp"
+                android:layout_height="2.5dp"
+                android:background="@drawable/shape_blue_round3"
+                android:visibility="gone"
+                app:layout_constraintBottom_toBottomOf="parent"
+                app:layout_constraintLeft_toLeftOf="@id/text_pulished"
+                app:layout_constraintRight_toRightOf="@id/text_pulished" />
+
+        </androidx.constraintlayout.widget.ConstraintLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="0.7dp"
+            android:background="@color/divider_color" />
+
+        <androidx.coordinatorlayout.widget.CoordinatorLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:background="@color/page_bg">
+
+            <com.google.android.material.appbar.AppBarLayout
+                android:id="@+id/app_bar_layout"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:background="@color/white"
+                app:elevation="0dp">
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="68dp"
+                    android:gravity="center_vertical"
+                    android:orientation="horizontal"
+                    app:layout_scrollFlags="scroll|snap|enterAlways"
+                    binding:clicks="@{click.gotoPostPage}">
+
+                    <com.guadou.lib_baselib.view.CircleImageView
+                        android:id="@+id/iv_feed_avatar"
+                        android:layout_width="@dimen/d_45dp"
+                        android:layout_height="@dimen/d_45dp"
+                        android:layout_marginLeft="@dimen/d_15dp"
+                        android:scaleType="centerCrop"
+                        android:src="@drawable/im_default_head" />
+
+                    <com.guadou.lib_baselib.font_text_view.TextViewBold
+                        android:layout_width="0dp"
+                        android:layout_height="wrap_content"
+                        android:layout_marginLeft="@dimen/d_19dp"
+                        android:layout_weight="1"
+                        android:text="在想什么有趣的呢?"
+                        android:textColor="@color/notify_dark_blue"
+                        android:textSize="@dimen/d_16sp" />
+
+                    <ImageView
+                        android:id="@+id/iv_feed_take_photo"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginRight="@dimen/d_16dp"
+                        android:src="@drawable/news_feed_camera" />
+
+                </LinearLayout>
+
+            </com.google.android.material.appbar.AppBarLayout>
+
+            <androidx.viewpager.widget.ViewPager
+                android:id="@+id/view_pager"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                app:layout_behavior="@string/appbar_scrolling_view_behavior" />
+
+        </androidx.coordinatorlayout.widget.CoordinatorLayout>
+
+    </LinearLayout>
+
+</layout>

+ 34 - 0
cpt_newsfeed/src/main/res/layout/fragment_newsfeed_profile.xml

@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:binding="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    tools:ignore="RtlHardcoded">
+
+    <data>
+
+        <variable
+            name="viewModel"
+            type="com.hongyegroup.cpt_newsfeed.mvvm.NewsFeedProfileViewModel" />
+
+        <variable
+            name="click"
+            type="com.hongyegroup.cpt_newsfeed.ui.NewsFeedProfileFragment.ClickProxy" />
+
+        <import type="android.text.TextUtils" />
+
+    </data>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="#3684F9"
+        android:orientation="vertical">
+
+        <com.guadou.lib_baselib.view.titlebar.StatusbarGrayView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content" />
+
+    </LinearLayout>
+
+</layout>

+ 239 - 0
cpt_newsfeed/src/main/res/layout/item_news_feed_news.xml

@@ -0,0 +1,239 @@
+<?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:id="@+id/ll_news_feed_root"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:background="@color/white"
+    android:orientation="vertical"
+    tools:viewBindingIgnore="true">
+
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/d_9dp"
+        android:background="@color/page_bg" />
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:gravity="center_vertical"
+        android:orientation="horizontal"
+        android:layout_marginTop="@dimen/d_10dp"
+        android:paddingLeft="@dimen/d_15dp"
+        android:paddingTop="@dimen/d_15dp"
+        android:paddingRight="@dimen/d_15dp"
+        android:paddingBottom="@dimen/d_8dp">
+
+        <com.guadou.lib_baselib.view.CircleImageView
+            android:id="@+id/iv_feed_news_avatar"
+            android:layout_width="@dimen/d_45dp"
+            android:layout_height="@dimen/d_45dp"
+            android:background="@drawable/im_default_head"
+            app:layout_constraintLeft_toLeftOf="parent" />
+
+        <LinearLayout
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:orientation="vertical">
+
+            <com.guadou.lib_baselib.font_text_view.TextViewBold
+                android:id="@+id/tv_feed_news_name"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="@dimen/d_12dp"
+                android:ellipsize="end"
+                android:singleLine="true"
+                android:text="丽莎"
+                android:textColor="@color/notify_dark_blue"
+                android:textSize="18dp" />
+
+            <com.guadou.lib_baselib.font_text_view.TextViewMedium
+                android:id="@+id/tv_feed_news_time"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="@dimen/d_12dp"
+                android:text="2022.02.08 18:01"
+                android:textColor="@color/gray_76"
+                android:textSize="@dimen/d_14sp" />
+
+        </LinearLayout>
+
+        <LinearLayout
+            android:id="@+id/ll_follow_box"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center_vertical"
+            android:background="@drawable/shape_news_feed_follow_red_round_18"
+            android:gravity="center"
+            android:orientation="horizontal"
+            android:paddingLeft="@dimen/d_11dp"
+            android:paddingTop="@dimen/d_5dp"
+            android:paddingRight="@dimen/d_11dp"
+            android:paddingBottom="@dimen/d_5dp">
+
+            <ImageView
+                android:id="@+id/iv_follow_icon"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="@dimen/d_0.5dp"
+                android:src="@drawable/newsfeed_profile_news_addfollow_red" />
+
+            <com.guadou.lib_baselib.font_text_view.TextViewMedium
+                android:id="@+id/tv_follow_text"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="@dimen/d_3dp"
+                android:text="Follow"
+                android:textColor="@color/white"
+                android:textSize="@dimen/d_14sp" />
+
+        </LinearLayout>
+
+    </LinearLayout>
+
+    <com.guadou.lib_baselib.font_text_view.TextViewMedium
+        android:id="@+id/tv_post_by_group"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginLeft="@dimen/d_20dp"
+        android:layout_marginRight="@dimen/d_20dp"
+        android:layout_marginBottom="@dimen/d_12dp"
+        android:textColor="@color/black"
+        android:textSize="@dimen/d_14sp"
+        tools:text="Share on Group Let’s Party Together." />
+
+    <com.hongyegroup.cpt_newsfeed.widget.expand.ExpandTextView
+        android:id="@+id/tv_feed_news_content"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginLeft="@dimen/d_20dp"
+        android:layout_marginRight="@dimen/d_20dp"
+        android:autoLink="web"
+        android:text="i wonder if you have any ideas about app design,Do you like the latest design or tetro design?"
+        android:textColor="@color/black"
+        android:textColorLink="@color/notify_dark_blue"
+        android:textIsSelectable="true"
+        android:textSize="@dimen/d_14sp" />
+
+
+    <com.guadou.ninegrid.nine_grid_layout.SimpleImageViewNineGrid
+        android:id="@+id/nine_grid_view"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginLeft="@dimen/d_20dp"
+        android:layout_marginTop="@dimen/d_10dp"
+        android:layout_marginRight="@dimen/d_20dp"
+        app:spacing="@dimen/d_13dp" />
+
+
+    <View
+        android:id="@+id/view_news_feed_bottom_line1"
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/d_0.5dp"
+        android:layout_marginTop="@dimen/d_10dp"
+        android:background="@color/divider_color_ee" />
+
+    <LinearLayout
+        android:id="@+id/ll_news_feed_bottom_options"
+        android:layout_width="match_parent"
+        android:layout_height="40dp"
+        android:orientation="horizontal">
+
+        <LinearLayout
+            android:id="@+id/ll_feed_news_like_root"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="1"
+            android:gravity="center">
+
+            <ImageView
+                android:id="@+id/iv_tv_feed_news_like_icon"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:src="@drawable/news_feed_likes_un" />
+
+            <com.guadou.lib_baselib.font_text_view.TextViewMedium
+                android:id="@+id/tv_feed_news_like_num"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="@dimen/d_10dp"
+                android:text="赞(1560)"
+                android:textColor="@color/gray_76"
+                android:textSize="@dimen/d_14sp" />
+
+        </LinearLayout>
+
+        <View
+            android:layout_width="@dimen/d_0.5dp"
+            android:layout_height="match_parent"
+            android:layout_marginTop="@dimen/d_8dp"
+            android:layout_marginBottom="@dimen/d_8dp"
+            android:background="@color/divider_color_ee" />
+
+        <LinearLayout
+            android:id="@+id/ll_feed_news_comment_root"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="1"
+            android:gravity="center">
+
+            <ImageView
+                android:id="@+id/iv_tv_feed_news_comment_icon"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="@dimen/d_2dp"
+                android:src="@drawable/news_feed_comments_un" />
+
+            <com.guadou.lib_baselib.font_text_view.TextViewMedium
+                android:id="@+id/tv_feed_news_comment_num"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="@dimen/d_10dp"
+                android:text="评论(160)"
+                android:textColor="@color/gray_76"
+                android:textSize="@dimen/d_14sp" />
+
+        </LinearLayout>
+
+        <View
+            android:layout_width="@dimen/d_0.5dp"
+            android:layout_height="match_parent"
+            android:layout_marginTop="@dimen/d_8dp"
+            android:layout_marginBottom="@dimen/d_8dp"
+            android:background="@color/divider_color_ee" />
+
+        <LinearLayout
+            android:id="@+id/ll_feed_news_share_root"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="1"
+            android:gravity="center">
+
+            <ImageView
+                android:id="@+id/iv_tv_feed_news_share_icon"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="@dimen/d_1dp"
+                android:src="@drawable/news_feed_share_un" />
+
+            <com.guadou.lib_baselib.font_text_view.TextViewMedium
+                android:id="@+id/tv_feed_news_share_num"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="@dimen/d_10dp"
+                android:text="分享"
+                android:textColor="@color/gray_76"
+                android:textSize="@dimen/d_14sp" />
+
+        </LinearLayout>
+
+    </LinearLayout>
+
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/d_1dp"
+        android:background="@color/page_bg" />
+
+</LinearLayout>

+ 347 - 0
cpt_newsfeed/src/main/res/layout/layout_placeholder_newsfeed_hot.xml

@@ -0,0 +1,347 @@
+<?xml version="1.0" encoding="utf-8"?>
+<com.guadou.lib_baselib.view.shimmer.ShimmerLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/shimmer_layout"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:tag="shimmer_layout">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="vertical">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical"
+            android:paddingLeft="@dimen/d_12dp"
+            android:paddingTop="@dimen/d_13dp"
+            android:paddingRight="@dimen/d_12dp">
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="horizontal">
+
+                <View
+                    android:layout_width="@dimen/d_45dp"
+                    android:layout_height="@dimen/d_45dp"
+                    android:background="@drawable/shimmer_circle_background" />
+
+                <LinearLayout
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_weight="1"
+                    android:orientation="vertical">
+
+                    <View
+                        android:layout_width="@dimen/d_100dp"
+                        android:layout_height="@dimen/d_25dp"
+                        android:layout_marginLeft="@dimen/d_10dp"
+                        android:background="@color/shimmer_background_color" />
+
+                    <View
+                        android:layout_width="@dimen/d_120dp"
+                        android:layout_height="@dimen/d_20dp"
+                        android:layout_marginLeft="@dimen/d_10dp"
+                        android:layout_marginTop="@dimen/d_5dp"
+                        android:background="@color/shimmer_background_color" />
+
+                </LinearLayout>
+
+            </LinearLayout>
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/d_60dp"
+                android:layout_marginTop="@dimen/d_10dp"
+                android:background="@color/shimmer_background_color" />
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="@dimen/d_10dp"
+                android:gravity="center"
+                android:orientation="horizontal">
+
+                <View
+                    android:layout_width="@dimen/d_80dp"
+                    android:layout_height="@dimen/d_80dp"
+                    android:layout_marginRight="@dimen/d_25dp"
+                    android:background="@drawable/shimmer_bg_rounded_corners5" />
+
+
+                <View
+                    android:layout_width="@dimen/d_80dp"
+                    android:layout_height="@dimen/d_80dp"
+                    android:layout_marginRight="@dimen/d_25dp"
+                    android:background="@drawable/shimmer_bg_rounded_corners5" />
+
+                <View
+                    android:layout_width="@dimen/d_80dp"
+                    android:layout_height="@dimen/d_80dp"
+                    android:layout_marginRight="@dimen/d_25dp"
+                    android:background="@drawable/shimmer_bg_rounded_corners5" />
+
+            </LinearLayout>
+
+        </LinearLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_10dp"
+            android:layout_marginTop="@dimen/d_10dp"
+            android:background="@color/shimmer_background_color" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical"
+            android:paddingLeft="@dimen/d_12dp"
+            android:paddingTop="@dimen/d_13dp"
+            android:paddingRight="@dimen/d_12dp">
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="horizontal">
+
+                <View
+                    android:layout_width="@dimen/d_45dp"
+                    android:layout_height="@dimen/d_45dp"
+                    android:background="@drawable/shimmer_circle_background" />
+
+                <LinearLayout
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_weight="1"
+                    android:orientation="vertical">
+
+                    <View
+                        android:layout_width="@dimen/d_100dp"
+                        android:layout_height="@dimen/d_25dp"
+                        android:layout_marginLeft="@dimen/d_10dp"
+                        android:background="@color/shimmer_background_color" />
+
+                    <View
+                        android:layout_width="@dimen/d_120dp"
+                        android:layout_height="@dimen/d_20dp"
+                        android:layout_marginLeft="@dimen/d_10dp"
+                        android:layout_marginTop="@dimen/d_5dp"
+                        android:background="@color/shimmer_background_color" />
+
+                </LinearLayout>
+
+            </LinearLayout>
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/d_60dp"
+                android:layout_marginTop="@dimen/d_10dp"
+                android:background="@color/shimmer_background_color" />
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="@dimen/d_10dp"
+                android:gravity="center"
+                android:orientation="horizontal">
+
+                <View
+                    android:layout_width="@dimen/d_80dp"
+                    android:layout_height="@dimen/d_80dp"
+                    android:layout_marginRight="@dimen/d_25dp"
+                    android:background="@drawable/shimmer_bg_rounded_corners5" />
+
+
+                <View
+                    android:layout_width="@dimen/d_80dp"
+                    android:layout_height="@dimen/d_80dp"
+                    android:layout_marginRight="@dimen/d_25dp"
+                    android:background="@drawable/shimmer_bg_rounded_corners5" />
+
+                <View
+                    android:layout_width="@dimen/d_80dp"
+                    android:layout_height="@dimen/d_80dp"
+                    android:layout_marginRight="@dimen/d_25dp"
+                    android:background="@drawable/shimmer_bg_rounded_corners5" />
+
+            </LinearLayout>
+
+        </LinearLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_10dp"
+            android:layout_marginTop="@dimen/d_10dp"
+            android:background="@color/shimmer_background_color" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical"
+            android:paddingLeft="@dimen/d_12dp"
+            android:paddingTop="@dimen/d_13dp"
+            android:paddingRight="@dimen/d_12dp">
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="horizontal">
+
+                <View
+                    android:layout_width="@dimen/d_45dp"
+                    android:layout_height="@dimen/d_45dp"
+                    android:background="@drawable/shimmer_circle_background" />
+
+                <LinearLayout
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_weight="1"
+                    android:orientation="vertical">
+
+                    <View
+                        android:layout_width="@dimen/d_100dp"
+                        android:layout_height="@dimen/d_25dp"
+                        android:layout_marginLeft="@dimen/d_10dp"
+                        android:background="@color/shimmer_background_color" />
+
+                    <View
+                        android:layout_width="@dimen/d_120dp"
+                        android:layout_height="@dimen/d_20dp"
+                        android:layout_marginLeft="@dimen/d_10dp"
+                        android:layout_marginTop="@dimen/d_5dp"
+                        android:background="@color/shimmer_background_color" />
+
+                </LinearLayout>
+
+            </LinearLayout>
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/d_60dp"
+                android:layout_marginTop="@dimen/d_10dp"
+                android:background="@color/shimmer_background_color" />
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="@dimen/d_10dp"
+                android:gravity="center"
+                android:orientation="horizontal">
+
+                <View
+                    android:layout_width="@dimen/d_80dp"
+                    android:layout_height="@dimen/d_80dp"
+                    android:layout_marginRight="@dimen/d_25dp"
+                    android:background="@drawable/shimmer_bg_rounded_corners5" />
+
+
+                <View
+                    android:layout_width="@dimen/d_80dp"
+                    android:layout_height="@dimen/d_80dp"
+                    android:layout_marginRight="@dimen/d_25dp"
+                    android:background="@drawable/shimmer_bg_rounded_corners5" />
+
+                <View
+                    android:layout_width="@dimen/d_80dp"
+                    android:layout_height="@dimen/d_80dp"
+                    android:layout_marginRight="@dimen/d_25dp"
+                    android:background="@drawable/shimmer_bg_rounded_corners5" />
+
+            </LinearLayout>
+
+        </LinearLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_10dp"
+            android:layout_marginTop="@dimen/d_10dp"
+            android:background="@color/shimmer_background_color" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical"
+            android:paddingLeft="@dimen/d_12dp"
+            android:paddingTop="@dimen/d_13dp"
+            android:paddingRight="@dimen/d_12dp">
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="horizontal">
+
+                <View
+                    android:layout_width="@dimen/d_45dp"
+                    android:layout_height="@dimen/d_45dp"
+                    android:background="@drawable/shimmer_circle_background" />
+
+                <LinearLayout
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_weight="1"
+                    android:orientation="vertical">
+
+                    <View
+                        android:layout_width="@dimen/d_100dp"
+                        android:layout_height="@dimen/d_25dp"
+                        android:layout_marginLeft="@dimen/d_10dp"
+                        android:background="@color/shimmer_background_color" />
+
+                    <View
+                        android:layout_width="@dimen/d_120dp"
+                        android:layout_height="@dimen/d_20dp"
+                        android:layout_marginLeft="@dimen/d_10dp"
+                        android:layout_marginTop="@dimen/d_5dp"
+                        android:background="@color/shimmer_background_color" />
+
+                </LinearLayout>
+
+            </LinearLayout>
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/d_60dp"
+                android:layout_marginTop="@dimen/d_10dp"
+                android:background="@color/shimmer_background_color" />
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="@dimen/d_10dp"
+                android:gravity="center"
+                android:orientation="horizontal">
+
+                <View
+                    android:layout_width="@dimen/d_80dp"
+                    android:layout_height="@dimen/d_80dp"
+                    android:layout_marginRight="@dimen/d_25dp"
+                    android:background="@drawable/shimmer_bg_rounded_corners5" />
+
+
+                <View
+                    android:layout_width="@dimen/d_80dp"
+                    android:layout_height="@dimen/d_80dp"
+                    android:layout_marginRight="@dimen/d_25dp"
+                    android:background="@drawable/shimmer_bg_rounded_corners5" />
+
+                <View
+                    android:layout_width="@dimen/d_80dp"
+                    android:layout_height="@dimen/d_80dp"
+                    android:layout_marginRight="@dimen/d_25dp"
+                    android:background="@drawable/shimmer_bg_rounded_corners5" />
+
+            </LinearLayout>
+
+        </LinearLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d_10dp"
+            android:layout_marginTop="@dimen/d_10dp"
+            android:background="@color/shimmer_background_color" />
+
+    </LinearLayout>
+
+</com.guadou.lib_baselib.view.shimmer.ShimmerLayout>

+ 17 - 0
cpt_newsfeed/src/test/java/com/hongyegroup/cpt_main/ExampleUnitTest.java

@@ -0,0 +1,17 @@
+package com.hongyegroup.cpt_main;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
+ */
+public class ExampleUnitTest {
+    @Test
+    public void addition_isCorrect() {
+        assertEquals(4, 2 + 2);
+    }
+}

+ 5 - 3
cpt_parttime/src/main/AndroidManifest.xml

@@ -4,11 +4,13 @@
 
     <application android:allowBackup="true">
 
-        <activity android:name=".ui.PartTimeJobDetailActivity" />
+        <activity android:name=".ui.activity.PartTimeJobDetailActivity" />
 
-        <activity android:name=".ui.ChooseCityActivity" />
+        <activity
+            android:name=".ui.activity.PartTimeMainActivity"
+            android:launchMode="singleTask" />
 
-        <activity android:name=".ui.PartJobAlbumActivity" />
+        <activity android:name=".ui.activity.PartJobAlbumActivity" />
 
         <activity android:name=".ui.SettingsActivity"/>
 

+ 0 - 54
cpt_parttime/src/main/java/com/hongyegroup/cpt_parttime/adapter/PartTimeJobAdapter.kt

@@ -1,54 +0,0 @@
-package com.hongyegroup.cpt_parttime.adapter
-
-import android.widget.ImageView
-import androidx.databinding.DataBindingUtil
-import androidx.databinding.ViewDataBinding
-import com.chad.library.adapter.base.viewholder.BaseViewHolder
-import com.guadou.cs_cptservices.binding.BaseMultiDataBindingAdapter
-import com.guadou.lib_baselib.engine.extLoad
-import com.guadou.lib_baselib.ext.dp2px
-import com.hongyegroup.cpt_parttime.R
-import com.hongyegroup.cpt_parttime.bean.PartJobResult
-
-/**
- * 多布局+DataBinding
- * 兼职工作首页的列表适配器
- */
-class PartTimeJobAdapter(br: Int, list: MutableList<PartJobResult>) :
-    BaseMultiDataBindingAdapter<PartJobResult>(br, list) {
-
-    init {
-        // 绑定 layout 对应的 type
-        addItemType(PartJobResult.TYPE_EMPTY, R.layout.item_empty_layout)
-        addItemType(PartJobResult.TYPE_ITEM, R.layout.item_parttime_job_view)
-        addItemType(PartJobResult.TYPE_BANNER, R.layout.item_parttime_banner)
-    }
-
-    override fun onItemViewHolderCreated(viewHolder: BaseViewHolder, viewType: Int) {
-        if (viewType != PartJobResult.TYPE_EMPTY) {
-            // 绑定databinding
-            DataBindingUtil.bind<ViewDataBinding>(viewHolder.itemView)
-        }
-    }
-
-    override fun convert(holder: BaseViewHolder, item: PartJobResult) {
-        if (holder.itemViewType != PartJobResult.TYPE_EMPTY) {
-            // 绑定databinding
-            holder.getBinding<ViewDataBinding>()?.run {
-                setVariable(_br, item)
-                executePendingBindings()
-            }
-        }
-
-        //不方便做DataBinding的操作 ↓
-        if (holder.itemViewType == PartJobResult.TYPE_ITEM) {
-
-        } else if (holder.itemViewType == PartJobResult.TYPE_BANNER) {
-
-            val imageUrl = "http://i03piccdn.sogoucdn.com/dbbea331b73acd7d"
-            holder.getView<ImageView>(R.id.iv_banner).extLoad(imageUrl, roundRadius = dp2px(8f))
-        }
-
-    }
-
-}

+ 0 - 32
cpt_parttime/src/main/java/com/hongyegroup/cpt_parttime/adapter/PopupPositionAdapter.kt

@@ -1,32 +0,0 @@
-package com.hongyegroup.cpt_parttime.adapter
-
-import android.widget.GridView
-import com.chad.library.adapter.base.BaseQuickAdapter
-import com.chad.library.adapter.base.viewholder.BaseViewHolder
-import com.guadou.lib_baselib.ext.checkEmpty
-import com.hongyegroup.cpt_parttime.R
-import com.hongyegroup.cpt_parttime.bean.PopupTitleSubTitleBean
-
-/**
- * 筛选职位信息弹窗中的列表
- */
-class PopupPositionAdapter(data: MutableList<PopupTitleSubTitleBean>) :
-    BaseQuickAdapter<PopupTitleSubTitleBean, BaseViewHolder>(R.layout.item_popup_position, data) {
-
-    override fun convert(holder: BaseViewHolder, item: PopupTitleSubTitleBean) {
-        holder.setIsRecyclable(false)  //禁止复用
-
-        holder.setText(R.id.tv_industry_name, item.title)
-            .setGone(R.id.tv_industry_name, item.title.checkEmpty())
-
-        val gridView = holder.getView<GridView>(R.id.grid_view)
-        val adapter = PositionGridAdapter(item.positions)
-        gridView.adapter = adapter
-        gridView.setOnItemClickListener { adapterView, view, index, long ->
-            val bean = item.positions[index]
-            bean.isSelected = !bean.isSelected
-            adapter.notifyDataSetChanged()
-        }
-    }
-
-}

+ 0 - 24
cpt_parttime/src/main/java/com/hongyegroup/cpt_parttime/adapter/PopupTextAdapter.kt

@@ -1,24 +0,0 @@
-package com.hongyegroup.cpt_parttime.adapter
-
-import android.view.View
-import androidx.recyclerview.widget.RecyclerView
-import com.guadou.lib_baselib.engine.toast
-import com.hongyegroup.cpt_parttime.R
-import com.lxj.easyadapter.EasyAdapter
-import com.lxj.easyadapter.MultiItemTypeAdapter
-import com.lxj.easyadapter.ViewHolder
-
-class PopupTextAdapter(dataes: MutableList<String>, layoutRes: Int) : EasyAdapter<String>(dataes, layoutRes) {
-
-    override fun bind(holder: ViewHolder, t: String, position: Int) {
-        holder.setText(R.id.tv_text, t)
-
-        setOnItemClickListener(object : MultiItemTypeAdapter.SimpleOnItemClickListener() {
-            override fun onItemClick(view: View, holder: RecyclerView.ViewHolder, position: Int) {
-                toast("chick item")
-            }
-        })
-    }
-
-
-}

+ 0 - 69
cpt_parttime/src/main/java/com/hongyegroup/cpt_parttime/adapter/PositionGridAdapter.java

@@ -1,69 +0,0 @@
-package com.hongyegroup.cpt_parttime.adapter;
-
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.BaseAdapter;
-import android.widget.TextView;
-
-import com.guadou.lib_baselib.utils.CommUtils;
-import com.hongyegroup.cpt_parttime.R;
-import com.hongyegroup.cpt_parttime.bean.PopupTitleSubTitleBean;
-
-import java.util.List;
-
-public class PositionGridAdapter extends BaseAdapter {
-
-    private List<PopupTitleSubTitleBean.SubBean> mDatas;
-
-    public PositionGridAdapter(List<PopupTitleSubTitleBean.SubBean> datas) {
-        this.mDatas = datas;
-    }
-
-    @Override
-    public int getCount() {
-        return mDatas.size();
-    }
-
-    @Override
-    public Object getItem(int i) {
-        return mDatas.get(i);
-    }
-
-    @Override
-    public long getItemId(int i) {
-        return i;
-    }
-
-    @Override
-    public View getView(int position, View convertView, ViewGroup parent) {
-
-        ViewHolder viewHolder = null;
-        if (convertView == null) {
-            convertView = CommUtils.inflate(R.layout.item_position_grid);
-            viewHolder = new ViewHolder();
-            viewHolder.tv = (TextView) convertView.findViewById(R.id.tv_position_name);
-            convertView.setTag(viewHolder);
-        } else {
-            viewHolder = (ViewHolder) convertView.getTag();
-        }
-
-        PopupTitleSubTitleBean.SubBean bean = mDatas.get(position);
-        viewHolder.tv.setText(bean.name);
-
-        //动态的设置背景
-        if (bean.isSelected) {
-            viewHolder.tv.setTextColor(CommUtils.getColor(R.color.app_blue));
-            viewHolder.tv.setBackgroundResource(R.drawable.shape_popup_position_active);
-        } else {
-            viewHolder.tv.setTextColor(CommUtils.getColor(R.color.black_33));
-            viewHolder.tv.setBackgroundResource(R.drawable.shape_popup_position_unactive);
-        }
-
-        return convertView;
-    }
-
-    static class ViewHolder {
-        public TextView tv;
-    }
-
-}

+ 1 - 18
cpt_parttime/src/main/java/com/hongyegroup/cpt_parttime/bean/PartJobResult.java

@@ -1,8 +1,6 @@
 package com.hongyegroup.cpt_parttime.bean;
 
-import com.chad.library.adapter.base.entity.MultiItemEntity;
-
-public class PartJobResult implements MultiItemEntity {
+public class PartJobResult{
 
     public String id;
     public String title;
@@ -12,19 +10,4 @@ public class PartJobResult implements MultiItemEntity {
     public String imgs;
     public String groupDate;
 
-
-    public static int TYPE_EMPTY = 0;
-    public static int TYPE_ITEM = 1;
-    public static int TYPE_BANNER = 2;
-
-    @Override
-    public int getItemType() {
-        if (type == 1) {
-            return TYPE_ITEM;
-        } else if (type == 2) {
-            return TYPE_BANNER;
-        } else {
-            return TYPE_EMPTY;
-        }
-    }
 }

+ 0 - 0
cpt_parttime/src/main/java/com/hongyegroup/cpt_parttime/mvvm/PartJobDetailChildViewModel.kt


Некоторые файлы не были показаны из-за большого количества измененных файлов