diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 97c55c3..0d85b90 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,6 +37,7 @@ + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 97c55c3..0d85b90 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,6 +37,7 @@ + \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt b/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt new file mode 100644 index 0000000..722e4d1 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.xz.meterage.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.xz.meterage.R +import com.casic.xz.meterage.model.NoticeListModel + +class NoticeListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun getItemCount(): Int = dataRows.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_notice_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] +// holder.noticeTypeIconView.setImageResource() + holder.noticeTitleView.text = rowsBean.noticeTitle + holder.noticeDateView.text = rowsBean.noticeTime + holder.noticeContentView.text = rowsBean.noticeSketch + val state = if (rowsBean.isDel == 0) { + View.VISIBLE + } else { + View.INVISIBLE + } + holder.readStateView.visibility = state + + //绑定事件 + holder.itemView.setOnClickListener { + listener?.onItemClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var noticeTypeIconView: ImageView = view.findViewById(R.id.noticeTypeIconView) + var readStateView: View = view.findViewById(R.id.readStateView) + var noticeTitleView: TextView = view.findViewById(R.id.noticeTitleView) + var noticeDateView: TextView = view.findViewById(R.id.noticeDateView) + var noticeContentView: TextView = view.findViewById(R.id.noticeContentView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 97c55c3..0d85b90 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,6 +37,7 @@ + \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt b/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt new file mode 100644 index 0000000..722e4d1 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.xz.meterage.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.xz.meterage.R +import com.casic.xz.meterage.model.NoticeListModel + +class NoticeListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun getItemCount(): Int = dataRows.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_notice_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] +// holder.noticeTypeIconView.setImageResource() + holder.noticeTitleView.text = rowsBean.noticeTitle + holder.noticeDateView.text = rowsBean.noticeTime + holder.noticeContentView.text = rowsBean.noticeSketch + val state = if (rowsBean.isDel == 0) { + View.VISIBLE + } else { + View.INVISIBLE + } + holder.readStateView.visibility = state + + //绑定事件 + holder.itemView.setOnClickListener { + listener?.onItemClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var noticeTypeIconView: ImageView = view.findViewById(R.id.noticeTypeIconView) + var readStateView: View = view.findViewById(R.id.readStateView) + var noticeTitleView: TextView = view.findViewById(R.id.noticeTitleView) + var noticeDateView: TextView = view.findViewById(R.id.noticeDateView) + var noticeContentView: TextView = view.findViewById(R.id.noticeContentView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt b/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt new file mode 100644 index 0000000..016ebcb --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt @@ -0,0 +1,28 @@ +package com.casic.xz.meterage.extensions + +/** + * ArrayList扩展方法 + */ + +//将图片集合格式化成满足上传格式的数据 +fun ArrayList.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, s -> + if (index == this.size - 1) { + builder.append(s) + } else { + builder.append(s).append(",") + } + } + return builder.toString() +} + +fun addAll(vararg args: String): ArrayList { + val result = ArrayList() + args.forEach { + result.add(it) + } + return result +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 97c55c3..0d85b90 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,6 +37,7 @@ + \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt b/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt new file mode 100644 index 0000000..722e4d1 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.xz.meterage.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.xz.meterage.R +import com.casic.xz.meterage.model.NoticeListModel + +class NoticeListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun getItemCount(): Int = dataRows.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_notice_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] +// holder.noticeTypeIconView.setImageResource() + holder.noticeTitleView.text = rowsBean.noticeTitle + holder.noticeDateView.text = rowsBean.noticeTime + holder.noticeContentView.text = rowsBean.noticeSketch + val state = if (rowsBean.isDel == 0) { + View.VISIBLE + } else { + View.INVISIBLE + } + holder.readStateView.visibility = state + + //绑定事件 + holder.itemView.setOnClickListener { + listener?.onItemClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var noticeTypeIconView: ImageView = view.findViewById(R.id.noticeTypeIconView) + var readStateView: View = view.findViewById(R.id.readStateView) + var noticeTitleView: TextView = view.findViewById(R.id.noticeTitleView) + var noticeDateView: TextView = view.findViewById(R.id.noticeDateView) + var noticeContentView: TextView = view.findViewById(R.id.noticeContentView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt b/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt new file mode 100644 index 0000000..016ebcb --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt @@ -0,0 +1,28 @@ +package com.casic.xz.meterage.extensions + +/** + * ArrayList扩展方法 + */ + +//将图片集合格式化成满足上传格式的数据 +fun ArrayList.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, s -> + if (index == this.size - 1) { + builder.append(s) + } else { + builder.append(s).append(",") + } + } + return builder.toString() +} + +fun addAll(vararg args: String): ArrayList { + val result = ArrayList() + args.forEach { + result.add(it) + } + return result +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 9b5faf6..b4628f3 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,8 +5,10 @@ import com.casic.xz.meterage.R import com.casic.xz.meterage.adapter.HomeGridAdapter import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo import kotlinx.android.synthetic.main.fragment_home.* class HomePageFragment : KotlinBaseFragment() { @@ -42,7 +44,9 @@ } override fun initEvent() { - + noticeLayout.setOnClickListener { + requireContext().navigatePageTo() + } } override fun initLayoutView(): Int = R.layout.fragment_home diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 97c55c3..0d85b90 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,6 +37,7 @@ + \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt b/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt new file mode 100644 index 0000000..722e4d1 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.xz.meterage.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.xz.meterage.R +import com.casic.xz.meterage.model.NoticeListModel + +class NoticeListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun getItemCount(): Int = dataRows.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_notice_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] +// holder.noticeTypeIconView.setImageResource() + holder.noticeTitleView.text = rowsBean.noticeTitle + holder.noticeDateView.text = rowsBean.noticeTime + holder.noticeContentView.text = rowsBean.noticeSketch + val state = if (rowsBean.isDel == 0) { + View.VISIBLE + } else { + View.INVISIBLE + } + holder.readStateView.visibility = state + + //绑定事件 + holder.itemView.setOnClickListener { + listener?.onItemClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var noticeTypeIconView: ImageView = view.findViewById(R.id.noticeTypeIconView) + var readStateView: View = view.findViewById(R.id.readStateView) + var noticeTitleView: TextView = view.findViewById(R.id.noticeTitleView) + var noticeDateView: TextView = view.findViewById(R.id.noticeDateView) + var noticeContentView: TextView = view.findViewById(R.id.noticeContentView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt b/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt new file mode 100644 index 0000000..016ebcb --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt @@ -0,0 +1,28 @@ +package com.casic.xz.meterage.extensions + +/** + * ArrayList扩展方法 + */ + +//将图片集合格式化成满足上传格式的数据 +fun ArrayList.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, s -> + if (index == this.size - 1) { + builder.append(s) + } else { + builder.append(s).append(",") + } + } + return builder.toString() +} + +fun addAll(vararg args: String): ArrayList { + val result = ArrayList() + args.forEach { + result.add(it) + } + return result +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 9b5faf6..b4628f3 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,8 +5,10 @@ import com.casic.xz.meterage.R import com.casic.xz.meterage.adapter.HomeGridAdapter import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo import kotlinx.android.synthetic.main.fragment_home.* class HomePageFragment : KotlinBaseFragment() { @@ -42,7 +44,9 @@ } override fun initEvent() { - + noticeLayout.setOnClickListener { + requireContext().navigatePageTo() + } } override fun initLayoutView(): Int = R.layout.fragment_home diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt index aaeb9df..7e75abe 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt @@ -4,9 +4,11 @@ import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.SaveKeyValues import kotlinx.android.synthetic.main.fragment_mine.* @@ -44,7 +46,9 @@ } override fun initEvent() { - + noticeLayout.setOnClickListener { + requireContext().navigatePageTo() + } } override fun initLayoutView(): Int = R.layout.fragment_mine diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 97c55c3..0d85b90 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,6 +37,7 @@ + \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt b/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt new file mode 100644 index 0000000..722e4d1 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.xz.meterage.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.xz.meterage.R +import com.casic.xz.meterage.model.NoticeListModel + +class NoticeListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun getItemCount(): Int = dataRows.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_notice_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] +// holder.noticeTypeIconView.setImageResource() + holder.noticeTitleView.text = rowsBean.noticeTitle + holder.noticeDateView.text = rowsBean.noticeTime + holder.noticeContentView.text = rowsBean.noticeSketch + val state = if (rowsBean.isDel == 0) { + View.VISIBLE + } else { + View.INVISIBLE + } + holder.readStateView.visibility = state + + //绑定事件 + holder.itemView.setOnClickListener { + listener?.onItemClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var noticeTypeIconView: ImageView = view.findViewById(R.id.noticeTypeIconView) + var readStateView: View = view.findViewById(R.id.readStateView) + var noticeTitleView: TextView = view.findViewById(R.id.noticeTitleView) + var noticeDateView: TextView = view.findViewById(R.id.noticeDateView) + var noticeContentView: TextView = view.findViewById(R.id.noticeContentView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt b/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt new file mode 100644 index 0000000..016ebcb --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt @@ -0,0 +1,28 @@ +package com.casic.xz.meterage.extensions + +/** + * ArrayList扩展方法 + */ + +//将图片集合格式化成满足上传格式的数据 +fun ArrayList.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, s -> + if (index == this.size - 1) { + builder.append(s) + } else { + builder.append(s).append(",") + } + } + return builder.toString() +} + +fun addAll(vararg args: String): ArrayList { + val result = ArrayList() + args.forEach { + result.add(it) + } + return result +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 9b5faf6..b4628f3 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,8 +5,10 @@ import com.casic.xz.meterage.R import com.casic.xz.meterage.adapter.HomeGridAdapter import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo import kotlinx.android.synthetic.main.fragment_home.* class HomePageFragment : KotlinBaseFragment() { @@ -42,7 +44,9 @@ } override fun initEvent() { - + noticeLayout.setOnClickListener { + requireContext().navigatePageTo() + } } override fun initLayoutView(): Int = R.layout.fragment_home diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt index aaeb9df..7e75abe 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt @@ -4,9 +4,11 @@ import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.SaveKeyValues import kotlinx.android.synthetic.main.fragment_mine.* @@ -44,7 +46,9 @@ } override fun initEvent() { - + noticeLayout.setOnClickListener { + requireContext().navigatePageTo() + } } override fun initLayoutView(): Int = R.layout.fragment_mine diff --git a/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt new file mode 100644 index 0000000..a14ec4d --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt @@ -0,0 +1,56 @@ +package com.casic.xz.meterage.view + +import android.annotation.SuppressLint +import androidx.lifecycle.ViewModelProvider +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.vm.NoticeViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import kotlinx.android.synthetic.main.activity_notice_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +@SuppressLint("SetTextI18n") +class NoticeDetailActivity : KotlinBaseActivity() { + + private lateinit var noticeViewModel: NoticeViewModel + + override fun initData() { + leftBackView.setOnClickListener { finish() } + titleView.text = "通知公告" + + val args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + + noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + noticeViewModel.getNoticeList(args[0], args[1], args[2], "", "", 1) + noticeViewModel.noticeResult.observe(this, { + if (it.code == 200) { + val dataRow = it.data?.rows!![0] + + noticeDateView.text = dataRow.noticeTime + noticePublisherView.text = "发布人 ${dataRow.noticePublisher}" + noticeCompanyView.text = "发布单位 ${dataRow.noticeCompany}" + + noticeNoView.text = dataRow.noticeNo + noticeTitleView.text = dataRow.noticeTitle + noticeSketchView.text = dataRow.noticeSketch + } + }) + } + + override fun initEvent() { + + } + + override fun initLayoutView(): Int = R.layout.activity_notice_detail + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 97c55c3..0d85b90 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,6 +37,7 @@ + \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt b/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt new file mode 100644 index 0000000..722e4d1 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.xz.meterage.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.xz.meterage.R +import com.casic.xz.meterage.model.NoticeListModel + +class NoticeListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun getItemCount(): Int = dataRows.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_notice_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] +// holder.noticeTypeIconView.setImageResource() + holder.noticeTitleView.text = rowsBean.noticeTitle + holder.noticeDateView.text = rowsBean.noticeTime + holder.noticeContentView.text = rowsBean.noticeSketch + val state = if (rowsBean.isDel == 0) { + View.VISIBLE + } else { + View.INVISIBLE + } + holder.readStateView.visibility = state + + //绑定事件 + holder.itemView.setOnClickListener { + listener?.onItemClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var noticeTypeIconView: ImageView = view.findViewById(R.id.noticeTypeIconView) + var readStateView: View = view.findViewById(R.id.readStateView) + var noticeTitleView: TextView = view.findViewById(R.id.noticeTitleView) + var noticeDateView: TextView = view.findViewById(R.id.noticeDateView) + var noticeContentView: TextView = view.findViewById(R.id.noticeContentView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt b/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt new file mode 100644 index 0000000..016ebcb --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt @@ -0,0 +1,28 @@ +package com.casic.xz.meterage.extensions + +/** + * ArrayList扩展方法 + */ + +//将图片集合格式化成满足上传格式的数据 +fun ArrayList.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, s -> + if (index == this.size - 1) { + builder.append(s) + } else { + builder.append(s).append(",") + } + } + return builder.toString() +} + +fun addAll(vararg args: String): ArrayList { + val result = ArrayList() + args.forEach { + result.add(it) + } + return result +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 9b5faf6..b4628f3 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,8 +5,10 @@ import com.casic.xz.meterage.R import com.casic.xz.meterage.adapter.HomeGridAdapter import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo import kotlinx.android.synthetic.main.fragment_home.* class HomePageFragment : KotlinBaseFragment() { @@ -42,7 +44,9 @@ } override fun initEvent() { - + noticeLayout.setOnClickListener { + requireContext().navigatePageTo() + } } override fun initLayoutView(): Int = R.layout.fragment_home diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt index aaeb9df..7e75abe 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt @@ -4,9 +4,11 @@ import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.SaveKeyValues import kotlinx.android.synthetic.main.fragment_mine.* @@ -44,7 +46,9 @@ } override fun initEvent() { - + noticeLayout.setOnClickListener { + requireContext().navigatePageTo() + } } override fun initLayoutView(): Int = R.layout.fragment_mine diff --git a/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt new file mode 100644 index 0000000..a14ec4d --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt @@ -0,0 +1,56 @@ +package com.casic.xz.meterage.view + +import android.annotation.SuppressLint +import androidx.lifecycle.ViewModelProvider +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.vm.NoticeViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import kotlinx.android.synthetic.main.activity_notice_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +@SuppressLint("SetTextI18n") +class NoticeDetailActivity : KotlinBaseActivity() { + + private lateinit var noticeViewModel: NoticeViewModel + + override fun initData() { + leftBackView.setOnClickListener { finish() } + titleView.text = "通知公告" + + val args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + + noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + noticeViewModel.getNoticeList(args[0], args[1], args[2], "", "", 1) + noticeViewModel.noticeResult.observe(this, { + if (it.code == 200) { + val dataRow = it.data?.rows!![0] + + noticeDateView.text = dataRow.noticeTime + noticePublisherView.text = "发布人 ${dataRow.noticePublisher}" + noticeCompanyView.text = "发布单位 ${dataRow.noticeCompany}" + + noticeNoView.text = dataRow.noticeNo + noticeTitleView.text = dataRow.noticeTitle + noticeSketchView.text = dataRow.noticeSketch + } + }) + } + + override fun initEvent() { + + } + + override fun initLayoutView(): Int = R.layout.activity_notice_detail + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt index 6dde53b..3c90012 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt @@ -1,20 +1,163 @@ package com.casic.xz.meterage.view +import android.os.Handler +import android.view.View import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.adapter.NoticeListAdapter +import com.casic.xz.meterage.extensions.addAll +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.NoticeListModel import com.casic.xz.meterage.vm.NoticeViewModel +import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.activity_notice_list.* +import kotlinx.android.synthetic.main.include_empty_view.* class NoticeListActivity : KotlinBaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var noticeViewModel: NoticeViewModel + private lateinit var noticeListAdapter: NoticeListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + noticeViewModel.noticeResult.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows!! +// countBadeNumber(dataRows) + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + noticeLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows) + noticeLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023013101) + } + }) } override fun initEvent() { + leftBackView.setOnClickListener { finish() } + rightOperateView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("确定将所有未读消息标为已读?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + } + + override fun onConfirmClick() { + //TODO 设置为已读 + } + }).build().show() + } + + if (hasNoticePermission()) { + openSystemNoticeLayout.visibility = View.GONE + openSystemNoticeLayout.visibility = View.GONE + } else { + openSystemNoticeLayout.setOnClickListener { + + } + + + closeLayoutView.setOnClickListener { + openSystemNoticeLayout.visibility = View.GONE + } + } + + noticeLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getNoticeListByPage() + } + + noticeLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getNoticeListByPage() + } + } + + override fun onResume() { + super.onResume() + getNoticeListByPage() + } + + private fun getNoticeListByPage() { + noticeViewModel.getNoticeList("", "", "", "", "", pageIndex) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023013101 -> { + if (isRefresh || isLoadMore) { + noticeListAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有任何消息") { + pageIndex = 1 + getNoticeListByPage() + } + } else { + emptyView!!.hide() + noticeListAdapter = NoticeListAdapter(this, dataBeans) + noticeRecyclerView.adapter = noticeListAdapter + noticeListAdapter.setOnItemClickListener(object : + NoticeListAdapter.OnItemClickListener { + override fun onItemClicked(position: Int) { + val rowsModel = dataBeans[position] + val allArgs = addAll( + rowsModel.noticeNo, + rowsModel.noticeTitle, + rowsModel.noticePublisher, + "", + "" + ) + navigatePageTo(allArgs) + } + }) + } + } + } + } + true + } + + //TODO 判断是否开启通知权限 + private fun hasNoticePermission(): Boolean { + + return false } override fun initLayoutView(): Int = R.layout.activity_notice_list @@ -24,6 +167,7 @@ } override fun setupTopBarLayout() { - + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) } } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 97c55c3..0d85b90 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,6 +37,7 @@ + \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt b/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt new file mode 100644 index 0000000..722e4d1 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.xz.meterage.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.xz.meterage.R +import com.casic.xz.meterage.model.NoticeListModel + +class NoticeListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun getItemCount(): Int = dataRows.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_notice_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] +// holder.noticeTypeIconView.setImageResource() + holder.noticeTitleView.text = rowsBean.noticeTitle + holder.noticeDateView.text = rowsBean.noticeTime + holder.noticeContentView.text = rowsBean.noticeSketch + val state = if (rowsBean.isDel == 0) { + View.VISIBLE + } else { + View.INVISIBLE + } + holder.readStateView.visibility = state + + //绑定事件 + holder.itemView.setOnClickListener { + listener?.onItemClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var noticeTypeIconView: ImageView = view.findViewById(R.id.noticeTypeIconView) + var readStateView: View = view.findViewById(R.id.readStateView) + var noticeTitleView: TextView = view.findViewById(R.id.noticeTitleView) + var noticeDateView: TextView = view.findViewById(R.id.noticeDateView) + var noticeContentView: TextView = view.findViewById(R.id.noticeContentView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt b/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt new file mode 100644 index 0000000..016ebcb --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt @@ -0,0 +1,28 @@ +package com.casic.xz.meterage.extensions + +/** + * ArrayList扩展方法 + */ + +//将图片集合格式化成满足上传格式的数据 +fun ArrayList.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, s -> + if (index == this.size - 1) { + builder.append(s) + } else { + builder.append(s).append(",") + } + } + return builder.toString() +} + +fun addAll(vararg args: String): ArrayList { + val result = ArrayList() + args.forEach { + result.add(it) + } + return result +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 9b5faf6..b4628f3 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,8 +5,10 @@ import com.casic.xz.meterage.R import com.casic.xz.meterage.adapter.HomeGridAdapter import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo import kotlinx.android.synthetic.main.fragment_home.* class HomePageFragment : KotlinBaseFragment() { @@ -42,7 +44,9 @@ } override fun initEvent() { - + noticeLayout.setOnClickListener { + requireContext().navigatePageTo() + } } override fun initLayoutView(): Int = R.layout.fragment_home diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt index aaeb9df..7e75abe 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt @@ -4,9 +4,11 @@ import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.SaveKeyValues import kotlinx.android.synthetic.main.fragment_mine.* @@ -44,7 +46,9 @@ } override fun initEvent() { - + noticeLayout.setOnClickListener { + requireContext().navigatePageTo() + } } override fun initLayoutView(): Int = R.layout.fragment_mine diff --git a/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt new file mode 100644 index 0000000..a14ec4d --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt @@ -0,0 +1,56 @@ +package com.casic.xz.meterage.view + +import android.annotation.SuppressLint +import androidx.lifecycle.ViewModelProvider +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.vm.NoticeViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import kotlinx.android.synthetic.main.activity_notice_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +@SuppressLint("SetTextI18n") +class NoticeDetailActivity : KotlinBaseActivity() { + + private lateinit var noticeViewModel: NoticeViewModel + + override fun initData() { + leftBackView.setOnClickListener { finish() } + titleView.text = "通知公告" + + val args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + + noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + noticeViewModel.getNoticeList(args[0], args[1], args[2], "", "", 1) + noticeViewModel.noticeResult.observe(this, { + if (it.code == 200) { + val dataRow = it.data?.rows!![0] + + noticeDateView.text = dataRow.noticeTime + noticePublisherView.text = "发布人 ${dataRow.noticePublisher}" + noticeCompanyView.text = "发布单位 ${dataRow.noticeCompany}" + + noticeNoView.text = dataRow.noticeNo + noticeTitleView.text = dataRow.noticeTitle + noticeSketchView.text = dataRow.noticeSketch + } + }) + } + + override fun initEvent() { + + } + + override fun initLayoutView(): Int = R.layout.activity_notice_detail + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt index 6dde53b..3c90012 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt @@ -1,20 +1,163 @@ package com.casic.xz.meterage.view +import android.os.Handler +import android.view.View import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.adapter.NoticeListAdapter +import com.casic.xz.meterage.extensions.addAll +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.NoticeListModel import com.casic.xz.meterage.vm.NoticeViewModel +import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.activity_notice_list.* +import kotlinx.android.synthetic.main.include_empty_view.* class NoticeListActivity : KotlinBaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var noticeViewModel: NoticeViewModel + private lateinit var noticeListAdapter: NoticeListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + noticeViewModel.noticeResult.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows!! +// countBadeNumber(dataRows) + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + noticeLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows) + noticeLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023013101) + } + }) } override fun initEvent() { + leftBackView.setOnClickListener { finish() } + rightOperateView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("确定将所有未读消息标为已读?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + } + + override fun onConfirmClick() { + //TODO 设置为已读 + } + }).build().show() + } + + if (hasNoticePermission()) { + openSystemNoticeLayout.visibility = View.GONE + openSystemNoticeLayout.visibility = View.GONE + } else { + openSystemNoticeLayout.setOnClickListener { + + } + + + closeLayoutView.setOnClickListener { + openSystemNoticeLayout.visibility = View.GONE + } + } + + noticeLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getNoticeListByPage() + } + + noticeLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getNoticeListByPage() + } + } + + override fun onResume() { + super.onResume() + getNoticeListByPage() + } + + private fun getNoticeListByPage() { + noticeViewModel.getNoticeList("", "", "", "", "", pageIndex) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023013101 -> { + if (isRefresh || isLoadMore) { + noticeListAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有任何消息") { + pageIndex = 1 + getNoticeListByPage() + } + } else { + emptyView!!.hide() + noticeListAdapter = NoticeListAdapter(this, dataBeans) + noticeRecyclerView.adapter = noticeListAdapter + noticeListAdapter.setOnItemClickListener(object : + NoticeListAdapter.OnItemClickListener { + override fun onItemClicked(position: Int) { + val rowsModel = dataBeans[position] + val allArgs = addAll( + rowsModel.noticeNo, + rowsModel.noticeTitle, + rowsModel.noticePublisher, + "", + "" + ) + navigatePageTo(allArgs) + } + }) + } + } + } + } + true + } + + //TODO 判断是否开启通知权限 + private fun hasNoticePermission(): Boolean { + + return false } override fun initLayoutView(): Int = R.layout.activity_notice_list @@ -24,6 +167,7 @@ } override fun setupTopBarLayout() { - + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) } } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_blue_radius_5.xml b/app/src/main/res/drawable/bg_solid_layout_blue_radius_5.xml new file mode 100644 index 0000000..7b86026 --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_blue_radius_5.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 97c55c3..0d85b90 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,6 +37,7 @@ + \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt b/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt new file mode 100644 index 0000000..722e4d1 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.xz.meterage.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.xz.meterage.R +import com.casic.xz.meterage.model.NoticeListModel + +class NoticeListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun getItemCount(): Int = dataRows.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_notice_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] +// holder.noticeTypeIconView.setImageResource() + holder.noticeTitleView.text = rowsBean.noticeTitle + holder.noticeDateView.text = rowsBean.noticeTime + holder.noticeContentView.text = rowsBean.noticeSketch + val state = if (rowsBean.isDel == 0) { + View.VISIBLE + } else { + View.INVISIBLE + } + holder.readStateView.visibility = state + + //绑定事件 + holder.itemView.setOnClickListener { + listener?.onItemClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var noticeTypeIconView: ImageView = view.findViewById(R.id.noticeTypeIconView) + var readStateView: View = view.findViewById(R.id.readStateView) + var noticeTitleView: TextView = view.findViewById(R.id.noticeTitleView) + var noticeDateView: TextView = view.findViewById(R.id.noticeDateView) + var noticeContentView: TextView = view.findViewById(R.id.noticeContentView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt b/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt new file mode 100644 index 0000000..016ebcb --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt @@ -0,0 +1,28 @@ +package com.casic.xz.meterage.extensions + +/** + * ArrayList扩展方法 + */ + +//将图片集合格式化成满足上传格式的数据 +fun ArrayList.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, s -> + if (index == this.size - 1) { + builder.append(s) + } else { + builder.append(s).append(",") + } + } + return builder.toString() +} + +fun addAll(vararg args: String): ArrayList { + val result = ArrayList() + args.forEach { + result.add(it) + } + return result +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 9b5faf6..b4628f3 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,8 +5,10 @@ import com.casic.xz.meterage.R import com.casic.xz.meterage.adapter.HomeGridAdapter import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo import kotlinx.android.synthetic.main.fragment_home.* class HomePageFragment : KotlinBaseFragment() { @@ -42,7 +44,9 @@ } override fun initEvent() { - + noticeLayout.setOnClickListener { + requireContext().navigatePageTo() + } } override fun initLayoutView(): Int = R.layout.fragment_home diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt index aaeb9df..7e75abe 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt @@ -4,9 +4,11 @@ import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.SaveKeyValues import kotlinx.android.synthetic.main.fragment_mine.* @@ -44,7 +46,9 @@ } override fun initEvent() { - + noticeLayout.setOnClickListener { + requireContext().navigatePageTo() + } } override fun initLayoutView(): Int = R.layout.fragment_mine diff --git a/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt new file mode 100644 index 0000000..a14ec4d --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt @@ -0,0 +1,56 @@ +package com.casic.xz.meterage.view + +import android.annotation.SuppressLint +import androidx.lifecycle.ViewModelProvider +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.vm.NoticeViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import kotlinx.android.synthetic.main.activity_notice_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +@SuppressLint("SetTextI18n") +class NoticeDetailActivity : KotlinBaseActivity() { + + private lateinit var noticeViewModel: NoticeViewModel + + override fun initData() { + leftBackView.setOnClickListener { finish() } + titleView.text = "通知公告" + + val args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + + noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + noticeViewModel.getNoticeList(args[0], args[1], args[2], "", "", 1) + noticeViewModel.noticeResult.observe(this, { + if (it.code == 200) { + val dataRow = it.data?.rows!![0] + + noticeDateView.text = dataRow.noticeTime + noticePublisherView.text = "发布人 ${dataRow.noticePublisher}" + noticeCompanyView.text = "发布单位 ${dataRow.noticeCompany}" + + noticeNoView.text = dataRow.noticeNo + noticeTitleView.text = dataRow.noticeTitle + noticeSketchView.text = dataRow.noticeSketch + } + }) + } + + override fun initEvent() { + + } + + override fun initLayoutView(): Int = R.layout.activity_notice_detail + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt index 6dde53b..3c90012 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt @@ -1,20 +1,163 @@ package com.casic.xz.meterage.view +import android.os.Handler +import android.view.View import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.adapter.NoticeListAdapter +import com.casic.xz.meterage.extensions.addAll +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.NoticeListModel import com.casic.xz.meterage.vm.NoticeViewModel +import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.activity_notice_list.* +import kotlinx.android.synthetic.main.include_empty_view.* class NoticeListActivity : KotlinBaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var noticeViewModel: NoticeViewModel + private lateinit var noticeListAdapter: NoticeListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + noticeViewModel.noticeResult.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows!! +// countBadeNumber(dataRows) + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + noticeLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows) + noticeLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023013101) + } + }) } override fun initEvent() { + leftBackView.setOnClickListener { finish() } + rightOperateView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("确定将所有未读消息标为已读?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + } + + override fun onConfirmClick() { + //TODO 设置为已读 + } + }).build().show() + } + + if (hasNoticePermission()) { + openSystemNoticeLayout.visibility = View.GONE + openSystemNoticeLayout.visibility = View.GONE + } else { + openSystemNoticeLayout.setOnClickListener { + + } + + + closeLayoutView.setOnClickListener { + openSystemNoticeLayout.visibility = View.GONE + } + } + + noticeLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getNoticeListByPage() + } + + noticeLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getNoticeListByPage() + } + } + + override fun onResume() { + super.onResume() + getNoticeListByPage() + } + + private fun getNoticeListByPage() { + noticeViewModel.getNoticeList("", "", "", "", "", pageIndex) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023013101 -> { + if (isRefresh || isLoadMore) { + noticeListAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有任何消息") { + pageIndex = 1 + getNoticeListByPage() + } + } else { + emptyView!!.hide() + noticeListAdapter = NoticeListAdapter(this, dataBeans) + noticeRecyclerView.adapter = noticeListAdapter + noticeListAdapter.setOnItemClickListener(object : + NoticeListAdapter.OnItemClickListener { + override fun onItemClicked(position: Int) { + val rowsModel = dataBeans[position] + val allArgs = addAll( + rowsModel.noticeNo, + rowsModel.noticeTitle, + rowsModel.noticePublisher, + "", + "" + ) + navigatePageTo(allArgs) + } + }) + } + } + } + } + true + } + + //TODO 判断是否开启通知权限 + private fun hasNoticePermission(): Boolean { + + return false } override fun initLayoutView(): Int = R.layout.activity_notice_list @@ -24,6 +167,7 @@ } override fun setupTopBarLayout() { - + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) } } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_blue_radius_5.xml b/app/src/main/res/drawable/bg_solid_layout_blue_radius_5.xml new file mode 100644 index 0000000..7b86026 --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_blue_radius_5.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_error.xml b/app/src/main/res/drawable/ic_error.xml new file mode 100644 index 0000000..3ee0260 --- /dev/null +++ b/app/src/main/res/drawable/ic_error.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 97c55c3..0d85b90 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,6 +37,7 @@ + \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt b/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt new file mode 100644 index 0000000..722e4d1 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.xz.meterage.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.xz.meterage.R +import com.casic.xz.meterage.model.NoticeListModel + +class NoticeListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun getItemCount(): Int = dataRows.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_notice_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] +// holder.noticeTypeIconView.setImageResource() + holder.noticeTitleView.text = rowsBean.noticeTitle + holder.noticeDateView.text = rowsBean.noticeTime + holder.noticeContentView.text = rowsBean.noticeSketch + val state = if (rowsBean.isDel == 0) { + View.VISIBLE + } else { + View.INVISIBLE + } + holder.readStateView.visibility = state + + //绑定事件 + holder.itemView.setOnClickListener { + listener?.onItemClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var noticeTypeIconView: ImageView = view.findViewById(R.id.noticeTypeIconView) + var readStateView: View = view.findViewById(R.id.readStateView) + var noticeTitleView: TextView = view.findViewById(R.id.noticeTitleView) + var noticeDateView: TextView = view.findViewById(R.id.noticeDateView) + var noticeContentView: TextView = view.findViewById(R.id.noticeContentView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt b/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt new file mode 100644 index 0000000..016ebcb --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt @@ -0,0 +1,28 @@ +package com.casic.xz.meterage.extensions + +/** + * ArrayList扩展方法 + */ + +//将图片集合格式化成满足上传格式的数据 +fun ArrayList.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, s -> + if (index == this.size - 1) { + builder.append(s) + } else { + builder.append(s).append(",") + } + } + return builder.toString() +} + +fun addAll(vararg args: String): ArrayList { + val result = ArrayList() + args.forEach { + result.add(it) + } + return result +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 9b5faf6..b4628f3 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,8 +5,10 @@ import com.casic.xz.meterage.R import com.casic.xz.meterage.adapter.HomeGridAdapter import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo import kotlinx.android.synthetic.main.fragment_home.* class HomePageFragment : KotlinBaseFragment() { @@ -42,7 +44,9 @@ } override fun initEvent() { - + noticeLayout.setOnClickListener { + requireContext().navigatePageTo() + } } override fun initLayoutView(): Int = R.layout.fragment_home diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt index aaeb9df..7e75abe 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt @@ -4,9 +4,11 @@ import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.SaveKeyValues import kotlinx.android.synthetic.main.fragment_mine.* @@ -44,7 +46,9 @@ } override fun initEvent() { - + noticeLayout.setOnClickListener { + requireContext().navigatePageTo() + } } override fun initLayoutView(): Int = R.layout.fragment_mine diff --git a/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt new file mode 100644 index 0000000..a14ec4d --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt @@ -0,0 +1,56 @@ +package com.casic.xz.meterage.view + +import android.annotation.SuppressLint +import androidx.lifecycle.ViewModelProvider +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.vm.NoticeViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import kotlinx.android.synthetic.main.activity_notice_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +@SuppressLint("SetTextI18n") +class NoticeDetailActivity : KotlinBaseActivity() { + + private lateinit var noticeViewModel: NoticeViewModel + + override fun initData() { + leftBackView.setOnClickListener { finish() } + titleView.text = "通知公告" + + val args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + + noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + noticeViewModel.getNoticeList(args[0], args[1], args[2], "", "", 1) + noticeViewModel.noticeResult.observe(this, { + if (it.code == 200) { + val dataRow = it.data?.rows!![0] + + noticeDateView.text = dataRow.noticeTime + noticePublisherView.text = "发布人 ${dataRow.noticePublisher}" + noticeCompanyView.text = "发布单位 ${dataRow.noticeCompany}" + + noticeNoView.text = dataRow.noticeNo + noticeTitleView.text = dataRow.noticeTitle + noticeSketchView.text = dataRow.noticeSketch + } + }) + } + + override fun initEvent() { + + } + + override fun initLayoutView(): Int = R.layout.activity_notice_detail + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt index 6dde53b..3c90012 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt @@ -1,20 +1,163 @@ package com.casic.xz.meterage.view +import android.os.Handler +import android.view.View import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.adapter.NoticeListAdapter +import com.casic.xz.meterage.extensions.addAll +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.NoticeListModel import com.casic.xz.meterage.vm.NoticeViewModel +import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.activity_notice_list.* +import kotlinx.android.synthetic.main.include_empty_view.* class NoticeListActivity : KotlinBaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var noticeViewModel: NoticeViewModel + private lateinit var noticeListAdapter: NoticeListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + noticeViewModel.noticeResult.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows!! +// countBadeNumber(dataRows) + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + noticeLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows) + noticeLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023013101) + } + }) } override fun initEvent() { + leftBackView.setOnClickListener { finish() } + rightOperateView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("确定将所有未读消息标为已读?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + } + + override fun onConfirmClick() { + //TODO 设置为已读 + } + }).build().show() + } + + if (hasNoticePermission()) { + openSystemNoticeLayout.visibility = View.GONE + openSystemNoticeLayout.visibility = View.GONE + } else { + openSystemNoticeLayout.setOnClickListener { + + } + + + closeLayoutView.setOnClickListener { + openSystemNoticeLayout.visibility = View.GONE + } + } + + noticeLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getNoticeListByPage() + } + + noticeLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getNoticeListByPage() + } + } + + override fun onResume() { + super.onResume() + getNoticeListByPage() + } + + private fun getNoticeListByPage() { + noticeViewModel.getNoticeList("", "", "", "", "", pageIndex) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023013101 -> { + if (isRefresh || isLoadMore) { + noticeListAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有任何消息") { + pageIndex = 1 + getNoticeListByPage() + } + } else { + emptyView!!.hide() + noticeListAdapter = NoticeListAdapter(this, dataBeans) + noticeRecyclerView.adapter = noticeListAdapter + noticeListAdapter.setOnItemClickListener(object : + NoticeListAdapter.OnItemClickListener { + override fun onItemClicked(position: Int) { + val rowsModel = dataBeans[position] + val allArgs = addAll( + rowsModel.noticeNo, + rowsModel.noticeTitle, + rowsModel.noticePublisher, + "", + "" + ) + navigatePageTo(allArgs) + } + }) + } + } + } + } + true + } + + //TODO 判断是否开启通知权限 + private fun hasNoticePermission(): Boolean { + + return false } override fun initLayoutView(): Int = R.layout.activity_notice_list @@ -24,6 +167,7 @@ } override fun setupTopBarLayout() { - + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) } } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_blue_radius_5.xml b/app/src/main/res/drawable/bg_solid_layout_blue_radius_5.xml new file mode 100644 index 0000000..7b86026 --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_blue_radius_5.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_error.xml b/app/src/main/res/drawable/ic_error.xml new file mode 100644 index 0000000..3ee0260 --- /dev/null +++ b/app/src/main/res/drawable/ic_error.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_notice.xml b/app/src/main/res/drawable/ic_notice.xml new file mode 100644 index 0000000..962e03f --- /dev/null +++ b/app/src/main/res/drawable/ic_notice.xml @@ -0,0 +1,13 @@ + + + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 97c55c3..0d85b90 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,6 +37,7 @@ + \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt b/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt new file mode 100644 index 0000000..722e4d1 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.xz.meterage.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.xz.meterage.R +import com.casic.xz.meterage.model.NoticeListModel + +class NoticeListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun getItemCount(): Int = dataRows.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_notice_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] +// holder.noticeTypeIconView.setImageResource() + holder.noticeTitleView.text = rowsBean.noticeTitle + holder.noticeDateView.text = rowsBean.noticeTime + holder.noticeContentView.text = rowsBean.noticeSketch + val state = if (rowsBean.isDel == 0) { + View.VISIBLE + } else { + View.INVISIBLE + } + holder.readStateView.visibility = state + + //绑定事件 + holder.itemView.setOnClickListener { + listener?.onItemClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var noticeTypeIconView: ImageView = view.findViewById(R.id.noticeTypeIconView) + var readStateView: View = view.findViewById(R.id.readStateView) + var noticeTitleView: TextView = view.findViewById(R.id.noticeTitleView) + var noticeDateView: TextView = view.findViewById(R.id.noticeDateView) + var noticeContentView: TextView = view.findViewById(R.id.noticeContentView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt b/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt new file mode 100644 index 0000000..016ebcb --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt @@ -0,0 +1,28 @@ +package com.casic.xz.meterage.extensions + +/** + * ArrayList扩展方法 + */ + +//将图片集合格式化成满足上传格式的数据 +fun ArrayList.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, s -> + if (index == this.size - 1) { + builder.append(s) + } else { + builder.append(s).append(",") + } + } + return builder.toString() +} + +fun addAll(vararg args: String): ArrayList { + val result = ArrayList() + args.forEach { + result.add(it) + } + return result +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 9b5faf6..b4628f3 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,8 +5,10 @@ import com.casic.xz.meterage.R import com.casic.xz.meterage.adapter.HomeGridAdapter import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo import kotlinx.android.synthetic.main.fragment_home.* class HomePageFragment : KotlinBaseFragment() { @@ -42,7 +44,9 @@ } override fun initEvent() { - + noticeLayout.setOnClickListener { + requireContext().navigatePageTo() + } } override fun initLayoutView(): Int = R.layout.fragment_home diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt index aaeb9df..7e75abe 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt @@ -4,9 +4,11 @@ import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.SaveKeyValues import kotlinx.android.synthetic.main.fragment_mine.* @@ -44,7 +46,9 @@ } override fun initEvent() { - + noticeLayout.setOnClickListener { + requireContext().navigatePageTo() + } } override fun initLayoutView(): Int = R.layout.fragment_mine diff --git a/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt new file mode 100644 index 0000000..a14ec4d --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt @@ -0,0 +1,56 @@ +package com.casic.xz.meterage.view + +import android.annotation.SuppressLint +import androidx.lifecycle.ViewModelProvider +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.vm.NoticeViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import kotlinx.android.synthetic.main.activity_notice_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +@SuppressLint("SetTextI18n") +class NoticeDetailActivity : KotlinBaseActivity() { + + private lateinit var noticeViewModel: NoticeViewModel + + override fun initData() { + leftBackView.setOnClickListener { finish() } + titleView.text = "通知公告" + + val args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + + noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + noticeViewModel.getNoticeList(args[0], args[1], args[2], "", "", 1) + noticeViewModel.noticeResult.observe(this, { + if (it.code == 200) { + val dataRow = it.data?.rows!![0] + + noticeDateView.text = dataRow.noticeTime + noticePublisherView.text = "发布人 ${dataRow.noticePublisher}" + noticeCompanyView.text = "发布单位 ${dataRow.noticeCompany}" + + noticeNoView.text = dataRow.noticeNo + noticeTitleView.text = dataRow.noticeTitle + noticeSketchView.text = dataRow.noticeSketch + } + }) + } + + override fun initEvent() { + + } + + override fun initLayoutView(): Int = R.layout.activity_notice_detail + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt index 6dde53b..3c90012 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt @@ -1,20 +1,163 @@ package com.casic.xz.meterage.view +import android.os.Handler +import android.view.View import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.adapter.NoticeListAdapter +import com.casic.xz.meterage.extensions.addAll +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.NoticeListModel import com.casic.xz.meterage.vm.NoticeViewModel +import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.activity_notice_list.* +import kotlinx.android.synthetic.main.include_empty_view.* class NoticeListActivity : KotlinBaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var noticeViewModel: NoticeViewModel + private lateinit var noticeListAdapter: NoticeListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + noticeViewModel.noticeResult.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows!! +// countBadeNumber(dataRows) + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + noticeLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows) + noticeLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023013101) + } + }) } override fun initEvent() { + leftBackView.setOnClickListener { finish() } + rightOperateView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("确定将所有未读消息标为已读?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + } + + override fun onConfirmClick() { + //TODO 设置为已读 + } + }).build().show() + } + + if (hasNoticePermission()) { + openSystemNoticeLayout.visibility = View.GONE + openSystemNoticeLayout.visibility = View.GONE + } else { + openSystemNoticeLayout.setOnClickListener { + + } + + + closeLayoutView.setOnClickListener { + openSystemNoticeLayout.visibility = View.GONE + } + } + + noticeLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getNoticeListByPage() + } + + noticeLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getNoticeListByPage() + } + } + + override fun onResume() { + super.onResume() + getNoticeListByPage() + } + + private fun getNoticeListByPage() { + noticeViewModel.getNoticeList("", "", "", "", "", pageIndex) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023013101 -> { + if (isRefresh || isLoadMore) { + noticeListAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有任何消息") { + pageIndex = 1 + getNoticeListByPage() + } + } else { + emptyView!!.hide() + noticeListAdapter = NoticeListAdapter(this, dataBeans) + noticeRecyclerView.adapter = noticeListAdapter + noticeListAdapter.setOnItemClickListener(object : + NoticeListAdapter.OnItemClickListener { + override fun onItemClicked(position: Int) { + val rowsModel = dataBeans[position] + val allArgs = addAll( + rowsModel.noticeNo, + rowsModel.noticeTitle, + rowsModel.noticePublisher, + "", + "" + ) + navigatePageTo(allArgs) + } + }) + } + } + } + } + true + } + + //TODO 判断是否开启通知权限 + private fun hasNoticePermission(): Boolean { + + return false } override fun initLayoutView(): Int = R.layout.activity_notice_list @@ -24,6 +167,7 @@ } override fun setupTopBarLayout() { - + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) } } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_blue_radius_5.xml b/app/src/main/res/drawable/bg_solid_layout_blue_radius_5.xml new file mode 100644 index 0000000..7b86026 --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_blue_radius_5.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_error.xml b/app/src/main/res/drawable/ic_error.xml new file mode 100644 index 0000000..3ee0260 --- /dev/null +++ b/app/src/main/res/drawable/ic_error.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_notice.xml b/app/src/main/res/drawable/ic_notice.xml new file mode 100644 index 0000000..962e03f --- /dev/null +++ b/app/src/main/res/drawable/ic_notice.xml @@ -0,0 +1,13 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_qr_code.xml b/app/src/main/res/drawable/ic_qr_code.xml index 43c8c42..3fc5935 100644 --- a/app/src/main/res/drawable/ic_qr_code.xml +++ b/app/src/main/res/drawable/ic_qr_code.xml @@ -5,8 +5,8 @@ android:viewportHeight="1024"> + android:pathData="M733.37,673.68H285.51a88.58,88.58 0,0 1,-88.58 -88.52v-149.56a88.58,88.58 0,0 1,88.58 -88.52h447.86a88.58,88.58 0,0 1,88.58 88.52v149.56a88.58,88.58 0,0 1,-88.58 88.52z" /> + android:pathData="M115.9,410.39A39.1,39.1 0,0 1,76.8 371.3L76.8,248.87A172.27,172.27 0,0 1,248.87 76.8L366.08,76.8a39.1,39.1 0,1 1,0 78.19L248.87,154.99a93.99,93.99 0,0 0,-93.89 93.89L154.99,371.3a39.1,39.1 0,0 1,-39.09 39.09zM371.31,942.08L248.87,942.08A172.27,172.27 0,0 1,76.8 770.01v-114.61a39.1,39.1 0,1 1,78.19 0v114.61a93.99,93.99 0,0 0,93.89 93.89h122.43a39.1,39.1 0,1 1,0 78.19zM770.01,942.08L652.8,942.08a39.1,39.1 0,1 1,0 -78.19h117.22a93.99,93.99 0,0 0,93.89 -93.89v-119.81a39.1,39.1 0,0 1,78.19 0v119.83A172.26,172.26 0,0 1,770.01 942.08zM902.99,410.39a39.1,39.1 0,0 1,-39.1 -39.09L863.89,248.87a93.99,93.99 0,0 0,-93.89 -93.89h-125.04a39.1,39.1 0,1 1,0 -78.19h125.04A172.27,172.27 0,0 1,942.08 248.87L942.08,371.3a39.1,39.1 0,0 1,-39.09 39.09zM717.94,551.14L300.94,551.14a39.1,39.1 0,0 1,0 -78.19h417a39.1,39.1 0,1 1,0 78.19z" /> diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 97c55c3..0d85b90 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,6 +37,7 @@ + \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt b/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt new file mode 100644 index 0000000..722e4d1 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.xz.meterage.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.xz.meterage.R +import com.casic.xz.meterage.model.NoticeListModel + +class NoticeListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun getItemCount(): Int = dataRows.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_notice_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] +// holder.noticeTypeIconView.setImageResource() + holder.noticeTitleView.text = rowsBean.noticeTitle + holder.noticeDateView.text = rowsBean.noticeTime + holder.noticeContentView.text = rowsBean.noticeSketch + val state = if (rowsBean.isDel == 0) { + View.VISIBLE + } else { + View.INVISIBLE + } + holder.readStateView.visibility = state + + //绑定事件 + holder.itemView.setOnClickListener { + listener?.onItemClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var noticeTypeIconView: ImageView = view.findViewById(R.id.noticeTypeIconView) + var readStateView: View = view.findViewById(R.id.readStateView) + var noticeTitleView: TextView = view.findViewById(R.id.noticeTitleView) + var noticeDateView: TextView = view.findViewById(R.id.noticeDateView) + var noticeContentView: TextView = view.findViewById(R.id.noticeContentView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt b/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt new file mode 100644 index 0000000..016ebcb --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt @@ -0,0 +1,28 @@ +package com.casic.xz.meterage.extensions + +/** + * ArrayList扩展方法 + */ + +//将图片集合格式化成满足上传格式的数据 +fun ArrayList.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, s -> + if (index == this.size - 1) { + builder.append(s) + } else { + builder.append(s).append(",") + } + } + return builder.toString() +} + +fun addAll(vararg args: String): ArrayList { + val result = ArrayList() + args.forEach { + result.add(it) + } + return result +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 9b5faf6..b4628f3 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,8 +5,10 @@ import com.casic.xz.meterage.R import com.casic.xz.meterage.adapter.HomeGridAdapter import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo import kotlinx.android.synthetic.main.fragment_home.* class HomePageFragment : KotlinBaseFragment() { @@ -42,7 +44,9 @@ } override fun initEvent() { - + noticeLayout.setOnClickListener { + requireContext().navigatePageTo() + } } override fun initLayoutView(): Int = R.layout.fragment_home diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt index aaeb9df..7e75abe 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt @@ -4,9 +4,11 @@ import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.SaveKeyValues import kotlinx.android.synthetic.main.fragment_mine.* @@ -44,7 +46,9 @@ } override fun initEvent() { - + noticeLayout.setOnClickListener { + requireContext().navigatePageTo() + } } override fun initLayoutView(): Int = R.layout.fragment_mine diff --git a/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt new file mode 100644 index 0000000..a14ec4d --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt @@ -0,0 +1,56 @@ +package com.casic.xz.meterage.view + +import android.annotation.SuppressLint +import androidx.lifecycle.ViewModelProvider +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.vm.NoticeViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import kotlinx.android.synthetic.main.activity_notice_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +@SuppressLint("SetTextI18n") +class NoticeDetailActivity : KotlinBaseActivity() { + + private lateinit var noticeViewModel: NoticeViewModel + + override fun initData() { + leftBackView.setOnClickListener { finish() } + titleView.text = "通知公告" + + val args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + + noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + noticeViewModel.getNoticeList(args[0], args[1], args[2], "", "", 1) + noticeViewModel.noticeResult.observe(this, { + if (it.code == 200) { + val dataRow = it.data?.rows!![0] + + noticeDateView.text = dataRow.noticeTime + noticePublisherView.text = "发布人 ${dataRow.noticePublisher}" + noticeCompanyView.text = "发布单位 ${dataRow.noticeCompany}" + + noticeNoView.text = dataRow.noticeNo + noticeTitleView.text = dataRow.noticeTitle + noticeSketchView.text = dataRow.noticeSketch + } + }) + } + + override fun initEvent() { + + } + + override fun initLayoutView(): Int = R.layout.activity_notice_detail + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt index 6dde53b..3c90012 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt @@ -1,20 +1,163 @@ package com.casic.xz.meterage.view +import android.os.Handler +import android.view.View import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.adapter.NoticeListAdapter +import com.casic.xz.meterage.extensions.addAll +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.NoticeListModel import com.casic.xz.meterage.vm.NoticeViewModel +import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.activity_notice_list.* +import kotlinx.android.synthetic.main.include_empty_view.* class NoticeListActivity : KotlinBaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var noticeViewModel: NoticeViewModel + private lateinit var noticeListAdapter: NoticeListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + noticeViewModel.noticeResult.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows!! +// countBadeNumber(dataRows) + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + noticeLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows) + noticeLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023013101) + } + }) } override fun initEvent() { + leftBackView.setOnClickListener { finish() } + rightOperateView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("确定将所有未读消息标为已读?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + } + + override fun onConfirmClick() { + //TODO 设置为已读 + } + }).build().show() + } + + if (hasNoticePermission()) { + openSystemNoticeLayout.visibility = View.GONE + openSystemNoticeLayout.visibility = View.GONE + } else { + openSystemNoticeLayout.setOnClickListener { + + } + + + closeLayoutView.setOnClickListener { + openSystemNoticeLayout.visibility = View.GONE + } + } + + noticeLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getNoticeListByPage() + } + + noticeLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getNoticeListByPage() + } + } + + override fun onResume() { + super.onResume() + getNoticeListByPage() + } + + private fun getNoticeListByPage() { + noticeViewModel.getNoticeList("", "", "", "", "", pageIndex) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023013101 -> { + if (isRefresh || isLoadMore) { + noticeListAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有任何消息") { + pageIndex = 1 + getNoticeListByPage() + } + } else { + emptyView!!.hide() + noticeListAdapter = NoticeListAdapter(this, dataBeans) + noticeRecyclerView.adapter = noticeListAdapter + noticeListAdapter.setOnItemClickListener(object : + NoticeListAdapter.OnItemClickListener { + override fun onItemClicked(position: Int) { + val rowsModel = dataBeans[position] + val allArgs = addAll( + rowsModel.noticeNo, + rowsModel.noticeTitle, + rowsModel.noticePublisher, + "", + "" + ) + navigatePageTo(allArgs) + } + }) + } + } + } + } + true + } + + //TODO 判断是否开启通知权限 + private fun hasNoticePermission(): Boolean { + + return false } override fun initLayoutView(): Int = R.layout.activity_notice_list @@ -24,6 +167,7 @@ } override fun setupTopBarLayout() { - + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) } } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_blue_radius_5.xml b/app/src/main/res/drawable/bg_solid_layout_blue_radius_5.xml new file mode 100644 index 0000000..7b86026 --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_blue_radius_5.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_error.xml b/app/src/main/res/drawable/ic_error.xml new file mode 100644 index 0000000..3ee0260 --- /dev/null +++ b/app/src/main/res/drawable/ic_error.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_notice.xml b/app/src/main/res/drawable/ic_notice.xml new file mode 100644 index 0000000..962e03f --- /dev/null +++ b/app/src/main/res/drawable/ic_notice.xml @@ -0,0 +1,13 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_qr_code.xml b/app/src/main/res/drawable/ic_qr_code.xml index 43c8c42..3fc5935 100644 --- a/app/src/main/res/drawable/ic_qr_code.xml +++ b/app/src/main/res/drawable/ic_qr_code.xml @@ -5,8 +5,8 @@ android:viewportHeight="1024"> + android:pathData="M733.37,673.68H285.51a88.58,88.58 0,0 1,-88.58 -88.52v-149.56a88.58,88.58 0,0 1,88.58 -88.52h447.86a88.58,88.58 0,0 1,88.58 88.52v149.56a88.58,88.58 0,0 1,-88.58 88.52z" /> + android:pathData="M115.9,410.39A39.1,39.1 0,0 1,76.8 371.3L76.8,248.87A172.27,172.27 0,0 1,248.87 76.8L366.08,76.8a39.1,39.1 0,1 1,0 78.19L248.87,154.99a93.99,93.99 0,0 0,-93.89 93.89L154.99,371.3a39.1,39.1 0,0 1,-39.09 39.09zM371.31,942.08L248.87,942.08A172.27,172.27 0,0 1,76.8 770.01v-114.61a39.1,39.1 0,1 1,78.19 0v114.61a93.99,93.99 0,0 0,93.89 93.89h122.43a39.1,39.1 0,1 1,0 78.19zM770.01,942.08L652.8,942.08a39.1,39.1 0,1 1,0 -78.19h117.22a93.99,93.99 0,0 0,93.89 -93.89v-119.81a39.1,39.1 0,0 1,78.19 0v119.83A172.26,172.26 0,0 1,770.01 942.08zM902.99,410.39a39.1,39.1 0,0 1,-39.1 -39.09L863.89,248.87a93.99,93.99 0,0 0,-93.89 -93.89h-125.04a39.1,39.1 0,1 1,0 -78.19h125.04A172.27,172.27 0,0 1,942.08 248.87L942.08,371.3a39.1,39.1 0,0 1,-39.09 39.09zM717.94,551.14L300.94,551.14a39.1,39.1 0,0 1,0 -78.19h417a39.1,39.1 0,1 1,0 78.19z" /> diff --git a/app/src/main/res/drawable/ic_read_notice.xml b/app/src/main/res/drawable/ic_read_notice.xml new file mode 100644 index 0000000..fef5b72 --- /dev/null +++ b/app/src/main/res/drawable/ic_read_notice.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 97c55c3..0d85b90 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,6 +37,7 @@ + \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt b/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt new file mode 100644 index 0000000..722e4d1 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.xz.meterage.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.xz.meterage.R +import com.casic.xz.meterage.model.NoticeListModel + +class NoticeListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun getItemCount(): Int = dataRows.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_notice_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] +// holder.noticeTypeIconView.setImageResource() + holder.noticeTitleView.text = rowsBean.noticeTitle + holder.noticeDateView.text = rowsBean.noticeTime + holder.noticeContentView.text = rowsBean.noticeSketch + val state = if (rowsBean.isDel == 0) { + View.VISIBLE + } else { + View.INVISIBLE + } + holder.readStateView.visibility = state + + //绑定事件 + holder.itemView.setOnClickListener { + listener?.onItemClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var noticeTypeIconView: ImageView = view.findViewById(R.id.noticeTypeIconView) + var readStateView: View = view.findViewById(R.id.readStateView) + var noticeTitleView: TextView = view.findViewById(R.id.noticeTitleView) + var noticeDateView: TextView = view.findViewById(R.id.noticeDateView) + var noticeContentView: TextView = view.findViewById(R.id.noticeContentView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt b/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt new file mode 100644 index 0000000..016ebcb --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt @@ -0,0 +1,28 @@ +package com.casic.xz.meterage.extensions + +/** + * ArrayList扩展方法 + */ + +//将图片集合格式化成满足上传格式的数据 +fun ArrayList.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, s -> + if (index == this.size - 1) { + builder.append(s) + } else { + builder.append(s).append(",") + } + } + return builder.toString() +} + +fun addAll(vararg args: String): ArrayList { + val result = ArrayList() + args.forEach { + result.add(it) + } + return result +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 9b5faf6..b4628f3 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,8 +5,10 @@ import com.casic.xz.meterage.R import com.casic.xz.meterage.adapter.HomeGridAdapter import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo import kotlinx.android.synthetic.main.fragment_home.* class HomePageFragment : KotlinBaseFragment() { @@ -42,7 +44,9 @@ } override fun initEvent() { - + noticeLayout.setOnClickListener { + requireContext().navigatePageTo() + } } override fun initLayoutView(): Int = R.layout.fragment_home diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt index aaeb9df..7e75abe 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt @@ -4,9 +4,11 @@ import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.SaveKeyValues import kotlinx.android.synthetic.main.fragment_mine.* @@ -44,7 +46,9 @@ } override fun initEvent() { - + noticeLayout.setOnClickListener { + requireContext().navigatePageTo() + } } override fun initLayoutView(): Int = R.layout.fragment_mine diff --git a/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt new file mode 100644 index 0000000..a14ec4d --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt @@ -0,0 +1,56 @@ +package com.casic.xz.meterage.view + +import android.annotation.SuppressLint +import androidx.lifecycle.ViewModelProvider +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.vm.NoticeViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import kotlinx.android.synthetic.main.activity_notice_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +@SuppressLint("SetTextI18n") +class NoticeDetailActivity : KotlinBaseActivity() { + + private lateinit var noticeViewModel: NoticeViewModel + + override fun initData() { + leftBackView.setOnClickListener { finish() } + titleView.text = "通知公告" + + val args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + + noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + noticeViewModel.getNoticeList(args[0], args[1], args[2], "", "", 1) + noticeViewModel.noticeResult.observe(this, { + if (it.code == 200) { + val dataRow = it.data?.rows!![0] + + noticeDateView.text = dataRow.noticeTime + noticePublisherView.text = "发布人 ${dataRow.noticePublisher}" + noticeCompanyView.text = "发布单位 ${dataRow.noticeCompany}" + + noticeNoView.text = dataRow.noticeNo + noticeTitleView.text = dataRow.noticeTitle + noticeSketchView.text = dataRow.noticeSketch + } + }) + } + + override fun initEvent() { + + } + + override fun initLayoutView(): Int = R.layout.activity_notice_detail + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt index 6dde53b..3c90012 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt @@ -1,20 +1,163 @@ package com.casic.xz.meterage.view +import android.os.Handler +import android.view.View import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.adapter.NoticeListAdapter +import com.casic.xz.meterage.extensions.addAll +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.NoticeListModel import com.casic.xz.meterage.vm.NoticeViewModel +import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.activity_notice_list.* +import kotlinx.android.synthetic.main.include_empty_view.* class NoticeListActivity : KotlinBaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var noticeViewModel: NoticeViewModel + private lateinit var noticeListAdapter: NoticeListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + noticeViewModel.noticeResult.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows!! +// countBadeNumber(dataRows) + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + noticeLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows) + noticeLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023013101) + } + }) } override fun initEvent() { + leftBackView.setOnClickListener { finish() } + rightOperateView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("确定将所有未读消息标为已读?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + } + + override fun onConfirmClick() { + //TODO 设置为已读 + } + }).build().show() + } + + if (hasNoticePermission()) { + openSystemNoticeLayout.visibility = View.GONE + openSystemNoticeLayout.visibility = View.GONE + } else { + openSystemNoticeLayout.setOnClickListener { + + } + + + closeLayoutView.setOnClickListener { + openSystemNoticeLayout.visibility = View.GONE + } + } + + noticeLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getNoticeListByPage() + } + + noticeLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getNoticeListByPage() + } + } + + override fun onResume() { + super.onResume() + getNoticeListByPage() + } + + private fun getNoticeListByPage() { + noticeViewModel.getNoticeList("", "", "", "", "", pageIndex) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023013101 -> { + if (isRefresh || isLoadMore) { + noticeListAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有任何消息") { + pageIndex = 1 + getNoticeListByPage() + } + } else { + emptyView!!.hide() + noticeListAdapter = NoticeListAdapter(this, dataBeans) + noticeRecyclerView.adapter = noticeListAdapter + noticeListAdapter.setOnItemClickListener(object : + NoticeListAdapter.OnItemClickListener { + override fun onItemClicked(position: Int) { + val rowsModel = dataBeans[position] + val allArgs = addAll( + rowsModel.noticeNo, + rowsModel.noticeTitle, + rowsModel.noticePublisher, + "", + "" + ) + navigatePageTo(allArgs) + } + }) + } + } + } + } + true + } + + //TODO 判断是否开启通知权限 + private fun hasNoticePermission(): Boolean { + + return false } override fun initLayoutView(): Int = R.layout.activity_notice_list @@ -24,6 +167,7 @@ } override fun setupTopBarLayout() { - + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) } } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_blue_radius_5.xml b/app/src/main/res/drawable/bg_solid_layout_blue_radius_5.xml new file mode 100644 index 0000000..7b86026 --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_blue_radius_5.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_error.xml b/app/src/main/res/drawable/ic_error.xml new file mode 100644 index 0000000..3ee0260 --- /dev/null +++ b/app/src/main/res/drawable/ic_error.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_notice.xml b/app/src/main/res/drawable/ic_notice.xml new file mode 100644 index 0000000..962e03f --- /dev/null +++ b/app/src/main/res/drawable/ic_notice.xml @@ -0,0 +1,13 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_qr_code.xml b/app/src/main/res/drawable/ic_qr_code.xml index 43c8c42..3fc5935 100644 --- a/app/src/main/res/drawable/ic_qr_code.xml +++ b/app/src/main/res/drawable/ic_qr_code.xml @@ -5,8 +5,8 @@ android:viewportHeight="1024"> + android:pathData="M733.37,673.68H285.51a88.58,88.58 0,0 1,-88.58 -88.52v-149.56a88.58,88.58 0,0 1,88.58 -88.52h447.86a88.58,88.58 0,0 1,88.58 88.52v149.56a88.58,88.58 0,0 1,-88.58 88.52z" /> + android:pathData="M115.9,410.39A39.1,39.1 0,0 1,76.8 371.3L76.8,248.87A172.27,172.27 0,0 1,248.87 76.8L366.08,76.8a39.1,39.1 0,1 1,0 78.19L248.87,154.99a93.99,93.99 0,0 0,-93.89 93.89L154.99,371.3a39.1,39.1 0,0 1,-39.09 39.09zM371.31,942.08L248.87,942.08A172.27,172.27 0,0 1,76.8 770.01v-114.61a39.1,39.1 0,1 1,78.19 0v114.61a93.99,93.99 0,0 0,93.89 93.89h122.43a39.1,39.1 0,1 1,0 78.19zM770.01,942.08L652.8,942.08a39.1,39.1 0,1 1,0 -78.19h117.22a93.99,93.99 0,0 0,93.89 -93.89v-119.81a39.1,39.1 0,0 1,78.19 0v119.83A172.26,172.26 0,0 1,770.01 942.08zM902.99,410.39a39.1,39.1 0,0 1,-39.1 -39.09L863.89,248.87a93.99,93.99 0,0 0,-93.89 -93.89h-125.04a39.1,39.1 0,1 1,0 -78.19h125.04A172.27,172.27 0,0 1,942.08 248.87L942.08,371.3a39.1,39.1 0,0 1,-39.09 39.09zM717.94,551.14L300.94,551.14a39.1,39.1 0,0 1,0 -78.19h417a39.1,39.1 0,1 1,0 78.19z" /> diff --git a/app/src/main/res/drawable/ic_read_notice.xml b/app/src/main/res/drawable/ic_read_notice.xml new file mode 100644 index 0000000..fef5b72 --- /dev/null +++ b/app/src/main/res/drawable/ic_read_notice.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_right_black.xml b/app/src/main/res/drawable/ic_right_black.xml new file mode 100644 index 0000000..a25faa7 --- /dev/null +++ b/app/src/main/res/drawable/ic_right_black.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 97c55c3..0d85b90 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,6 +37,7 @@ + \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt b/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt new file mode 100644 index 0000000..722e4d1 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.xz.meterage.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.xz.meterage.R +import com.casic.xz.meterage.model.NoticeListModel + +class NoticeListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun getItemCount(): Int = dataRows.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_notice_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] +// holder.noticeTypeIconView.setImageResource() + holder.noticeTitleView.text = rowsBean.noticeTitle + holder.noticeDateView.text = rowsBean.noticeTime + holder.noticeContentView.text = rowsBean.noticeSketch + val state = if (rowsBean.isDel == 0) { + View.VISIBLE + } else { + View.INVISIBLE + } + holder.readStateView.visibility = state + + //绑定事件 + holder.itemView.setOnClickListener { + listener?.onItemClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var noticeTypeIconView: ImageView = view.findViewById(R.id.noticeTypeIconView) + var readStateView: View = view.findViewById(R.id.readStateView) + var noticeTitleView: TextView = view.findViewById(R.id.noticeTitleView) + var noticeDateView: TextView = view.findViewById(R.id.noticeDateView) + var noticeContentView: TextView = view.findViewById(R.id.noticeContentView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt b/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt new file mode 100644 index 0000000..016ebcb --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt @@ -0,0 +1,28 @@ +package com.casic.xz.meterage.extensions + +/** + * ArrayList扩展方法 + */ + +//将图片集合格式化成满足上传格式的数据 +fun ArrayList.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, s -> + if (index == this.size - 1) { + builder.append(s) + } else { + builder.append(s).append(",") + } + } + return builder.toString() +} + +fun addAll(vararg args: String): ArrayList { + val result = ArrayList() + args.forEach { + result.add(it) + } + return result +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 9b5faf6..b4628f3 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,8 +5,10 @@ import com.casic.xz.meterage.R import com.casic.xz.meterage.adapter.HomeGridAdapter import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo import kotlinx.android.synthetic.main.fragment_home.* class HomePageFragment : KotlinBaseFragment() { @@ -42,7 +44,9 @@ } override fun initEvent() { - + noticeLayout.setOnClickListener { + requireContext().navigatePageTo() + } } override fun initLayoutView(): Int = R.layout.fragment_home diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt index aaeb9df..7e75abe 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt @@ -4,9 +4,11 @@ import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.SaveKeyValues import kotlinx.android.synthetic.main.fragment_mine.* @@ -44,7 +46,9 @@ } override fun initEvent() { - + noticeLayout.setOnClickListener { + requireContext().navigatePageTo() + } } override fun initLayoutView(): Int = R.layout.fragment_mine diff --git a/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt new file mode 100644 index 0000000..a14ec4d --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt @@ -0,0 +1,56 @@ +package com.casic.xz.meterage.view + +import android.annotation.SuppressLint +import androidx.lifecycle.ViewModelProvider +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.vm.NoticeViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import kotlinx.android.synthetic.main.activity_notice_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +@SuppressLint("SetTextI18n") +class NoticeDetailActivity : KotlinBaseActivity() { + + private lateinit var noticeViewModel: NoticeViewModel + + override fun initData() { + leftBackView.setOnClickListener { finish() } + titleView.text = "通知公告" + + val args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + + noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + noticeViewModel.getNoticeList(args[0], args[1], args[2], "", "", 1) + noticeViewModel.noticeResult.observe(this, { + if (it.code == 200) { + val dataRow = it.data?.rows!![0] + + noticeDateView.text = dataRow.noticeTime + noticePublisherView.text = "发布人 ${dataRow.noticePublisher}" + noticeCompanyView.text = "发布单位 ${dataRow.noticeCompany}" + + noticeNoView.text = dataRow.noticeNo + noticeTitleView.text = dataRow.noticeTitle + noticeSketchView.text = dataRow.noticeSketch + } + }) + } + + override fun initEvent() { + + } + + override fun initLayoutView(): Int = R.layout.activity_notice_detail + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt index 6dde53b..3c90012 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt @@ -1,20 +1,163 @@ package com.casic.xz.meterage.view +import android.os.Handler +import android.view.View import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.adapter.NoticeListAdapter +import com.casic.xz.meterage.extensions.addAll +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.NoticeListModel import com.casic.xz.meterage.vm.NoticeViewModel +import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.activity_notice_list.* +import kotlinx.android.synthetic.main.include_empty_view.* class NoticeListActivity : KotlinBaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var noticeViewModel: NoticeViewModel + private lateinit var noticeListAdapter: NoticeListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + noticeViewModel.noticeResult.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows!! +// countBadeNumber(dataRows) + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + noticeLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows) + noticeLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023013101) + } + }) } override fun initEvent() { + leftBackView.setOnClickListener { finish() } + rightOperateView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("确定将所有未读消息标为已读?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + } + + override fun onConfirmClick() { + //TODO 设置为已读 + } + }).build().show() + } + + if (hasNoticePermission()) { + openSystemNoticeLayout.visibility = View.GONE + openSystemNoticeLayout.visibility = View.GONE + } else { + openSystemNoticeLayout.setOnClickListener { + + } + + + closeLayoutView.setOnClickListener { + openSystemNoticeLayout.visibility = View.GONE + } + } + + noticeLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getNoticeListByPage() + } + + noticeLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getNoticeListByPage() + } + } + + override fun onResume() { + super.onResume() + getNoticeListByPage() + } + + private fun getNoticeListByPage() { + noticeViewModel.getNoticeList("", "", "", "", "", pageIndex) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023013101 -> { + if (isRefresh || isLoadMore) { + noticeListAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有任何消息") { + pageIndex = 1 + getNoticeListByPage() + } + } else { + emptyView!!.hide() + noticeListAdapter = NoticeListAdapter(this, dataBeans) + noticeRecyclerView.adapter = noticeListAdapter + noticeListAdapter.setOnItemClickListener(object : + NoticeListAdapter.OnItemClickListener { + override fun onItemClicked(position: Int) { + val rowsModel = dataBeans[position] + val allArgs = addAll( + rowsModel.noticeNo, + rowsModel.noticeTitle, + rowsModel.noticePublisher, + "", + "" + ) + navigatePageTo(allArgs) + } + }) + } + } + } + } + true + } + + //TODO 判断是否开启通知权限 + private fun hasNoticePermission(): Boolean { + + return false } override fun initLayoutView(): Int = R.layout.activity_notice_list @@ -24,6 +167,7 @@ } override fun setupTopBarLayout() { - + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) } } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_blue_radius_5.xml b/app/src/main/res/drawable/bg_solid_layout_blue_radius_5.xml new file mode 100644 index 0000000..7b86026 --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_blue_radius_5.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_error.xml b/app/src/main/res/drawable/ic_error.xml new file mode 100644 index 0000000..3ee0260 --- /dev/null +++ b/app/src/main/res/drawable/ic_error.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_notice.xml b/app/src/main/res/drawable/ic_notice.xml new file mode 100644 index 0000000..962e03f --- /dev/null +++ b/app/src/main/res/drawable/ic_notice.xml @@ -0,0 +1,13 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_qr_code.xml b/app/src/main/res/drawable/ic_qr_code.xml index 43c8c42..3fc5935 100644 --- a/app/src/main/res/drawable/ic_qr_code.xml +++ b/app/src/main/res/drawable/ic_qr_code.xml @@ -5,8 +5,8 @@ android:viewportHeight="1024"> + android:pathData="M733.37,673.68H285.51a88.58,88.58 0,0 1,-88.58 -88.52v-149.56a88.58,88.58 0,0 1,88.58 -88.52h447.86a88.58,88.58 0,0 1,88.58 88.52v149.56a88.58,88.58 0,0 1,-88.58 88.52z" /> + android:pathData="M115.9,410.39A39.1,39.1 0,0 1,76.8 371.3L76.8,248.87A172.27,172.27 0,0 1,248.87 76.8L366.08,76.8a39.1,39.1 0,1 1,0 78.19L248.87,154.99a93.99,93.99 0,0 0,-93.89 93.89L154.99,371.3a39.1,39.1 0,0 1,-39.09 39.09zM371.31,942.08L248.87,942.08A172.27,172.27 0,0 1,76.8 770.01v-114.61a39.1,39.1 0,1 1,78.19 0v114.61a93.99,93.99 0,0 0,93.89 93.89h122.43a39.1,39.1 0,1 1,0 78.19zM770.01,942.08L652.8,942.08a39.1,39.1 0,1 1,0 -78.19h117.22a93.99,93.99 0,0 0,93.89 -93.89v-119.81a39.1,39.1 0,0 1,78.19 0v119.83A172.26,172.26 0,0 1,770.01 942.08zM902.99,410.39a39.1,39.1 0,0 1,-39.1 -39.09L863.89,248.87a93.99,93.99 0,0 0,-93.89 -93.89h-125.04a39.1,39.1 0,1 1,0 -78.19h125.04A172.27,172.27 0,0 1,942.08 248.87L942.08,371.3a39.1,39.1 0,0 1,-39.09 39.09zM717.94,551.14L300.94,551.14a39.1,39.1 0,0 1,0 -78.19h417a39.1,39.1 0,1 1,0 78.19z" /> diff --git a/app/src/main/res/drawable/ic_read_notice.xml b/app/src/main/res/drawable/ic_read_notice.xml new file mode 100644 index 0000000..fef5b72 --- /dev/null +++ b/app/src/main/res/drawable/ic_read_notice.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_right_black.xml b/app/src/main/res/drawable/ic_right_black.xml new file mode 100644 index 0000000..a25faa7 --- /dev/null +++ b/app/src/main/res/drawable/ic_right_black.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_notice_detail.xml b/app/src/main/res/layout/activity_notice_detail.xml new file mode 100644 index 0000000..25b055f --- /dev/null +++ b/app/src/main/res/layout/activity_notice_detail.xml @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 97c55c3..0d85b90 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,6 +37,7 @@ + \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt b/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt new file mode 100644 index 0000000..722e4d1 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.xz.meterage.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.xz.meterage.R +import com.casic.xz.meterage.model.NoticeListModel + +class NoticeListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun getItemCount(): Int = dataRows.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_notice_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] +// holder.noticeTypeIconView.setImageResource() + holder.noticeTitleView.text = rowsBean.noticeTitle + holder.noticeDateView.text = rowsBean.noticeTime + holder.noticeContentView.text = rowsBean.noticeSketch + val state = if (rowsBean.isDel == 0) { + View.VISIBLE + } else { + View.INVISIBLE + } + holder.readStateView.visibility = state + + //绑定事件 + holder.itemView.setOnClickListener { + listener?.onItemClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var noticeTypeIconView: ImageView = view.findViewById(R.id.noticeTypeIconView) + var readStateView: View = view.findViewById(R.id.readStateView) + var noticeTitleView: TextView = view.findViewById(R.id.noticeTitleView) + var noticeDateView: TextView = view.findViewById(R.id.noticeDateView) + var noticeContentView: TextView = view.findViewById(R.id.noticeContentView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt b/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt new file mode 100644 index 0000000..016ebcb --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt @@ -0,0 +1,28 @@ +package com.casic.xz.meterage.extensions + +/** + * ArrayList扩展方法 + */ + +//将图片集合格式化成满足上传格式的数据 +fun ArrayList.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, s -> + if (index == this.size - 1) { + builder.append(s) + } else { + builder.append(s).append(",") + } + } + return builder.toString() +} + +fun addAll(vararg args: String): ArrayList { + val result = ArrayList() + args.forEach { + result.add(it) + } + return result +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 9b5faf6..b4628f3 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,8 +5,10 @@ import com.casic.xz.meterage.R import com.casic.xz.meterage.adapter.HomeGridAdapter import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo import kotlinx.android.synthetic.main.fragment_home.* class HomePageFragment : KotlinBaseFragment() { @@ -42,7 +44,9 @@ } override fun initEvent() { - + noticeLayout.setOnClickListener { + requireContext().navigatePageTo() + } } override fun initLayoutView(): Int = R.layout.fragment_home diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt index aaeb9df..7e75abe 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt @@ -4,9 +4,11 @@ import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.SaveKeyValues import kotlinx.android.synthetic.main.fragment_mine.* @@ -44,7 +46,9 @@ } override fun initEvent() { - + noticeLayout.setOnClickListener { + requireContext().navigatePageTo() + } } override fun initLayoutView(): Int = R.layout.fragment_mine diff --git a/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt new file mode 100644 index 0000000..a14ec4d --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt @@ -0,0 +1,56 @@ +package com.casic.xz.meterage.view + +import android.annotation.SuppressLint +import androidx.lifecycle.ViewModelProvider +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.vm.NoticeViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import kotlinx.android.synthetic.main.activity_notice_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +@SuppressLint("SetTextI18n") +class NoticeDetailActivity : KotlinBaseActivity() { + + private lateinit var noticeViewModel: NoticeViewModel + + override fun initData() { + leftBackView.setOnClickListener { finish() } + titleView.text = "通知公告" + + val args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + + noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + noticeViewModel.getNoticeList(args[0], args[1], args[2], "", "", 1) + noticeViewModel.noticeResult.observe(this, { + if (it.code == 200) { + val dataRow = it.data?.rows!![0] + + noticeDateView.text = dataRow.noticeTime + noticePublisherView.text = "发布人 ${dataRow.noticePublisher}" + noticeCompanyView.text = "发布单位 ${dataRow.noticeCompany}" + + noticeNoView.text = dataRow.noticeNo + noticeTitleView.text = dataRow.noticeTitle + noticeSketchView.text = dataRow.noticeSketch + } + }) + } + + override fun initEvent() { + + } + + override fun initLayoutView(): Int = R.layout.activity_notice_detail + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt index 6dde53b..3c90012 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt @@ -1,20 +1,163 @@ package com.casic.xz.meterage.view +import android.os.Handler +import android.view.View import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.adapter.NoticeListAdapter +import com.casic.xz.meterage.extensions.addAll +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.NoticeListModel import com.casic.xz.meterage.vm.NoticeViewModel +import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.activity_notice_list.* +import kotlinx.android.synthetic.main.include_empty_view.* class NoticeListActivity : KotlinBaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var noticeViewModel: NoticeViewModel + private lateinit var noticeListAdapter: NoticeListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + noticeViewModel.noticeResult.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows!! +// countBadeNumber(dataRows) + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + noticeLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows) + noticeLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023013101) + } + }) } override fun initEvent() { + leftBackView.setOnClickListener { finish() } + rightOperateView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("确定将所有未读消息标为已读?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + } + + override fun onConfirmClick() { + //TODO 设置为已读 + } + }).build().show() + } + + if (hasNoticePermission()) { + openSystemNoticeLayout.visibility = View.GONE + openSystemNoticeLayout.visibility = View.GONE + } else { + openSystemNoticeLayout.setOnClickListener { + + } + + + closeLayoutView.setOnClickListener { + openSystemNoticeLayout.visibility = View.GONE + } + } + + noticeLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getNoticeListByPage() + } + + noticeLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getNoticeListByPage() + } + } + + override fun onResume() { + super.onResume() + getNoticeListByPage() + } + + private fun getNoticeListByPage() { + noticeViewModel.getNoticeList("", "", "", "", "", pageIndex) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023013101 -> { + if (isRefresh || isLoadMore) { + noticeListAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有任何消息") { + pageIndex = 1 + getNoticeListByPage() + } + } else { + emptyView!!.hide() + noticeListAdapter = NoticeListAdapter(this, dataBeans) + noticeRecyclerView.adapter = noticeListAdapter + noticeListAdapter.setOnItemClickListener(object : + NoticeListAdapter.OnItemClickListener { + override fun onItemClicked(position: Int) { + val rowsModel = dataBeans[position] + val allArgs = addAll( + rowsModel.noticeNo, + rowsModel.noticeTitle, + rowsModel.noticePublisher, + "", + "" + ) + navigatePageTo(allArgs) + } + }) + } + } + } + } + true + } + + //TODO 判断是否开启通知权限 + private fun hasNoticePermission(): Boolean { + + return false } override fun initLayoutView(): Int = R.layout.activity_notice_list @@ -24,6 +167,7 @@ } override fun setupTopBarLayout() { - + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) } } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_blue_radius_5.xml b/app/src/main/res/drawable/bg_solid_layout_blue_radius_5.xml new file mode 100644 index 0000000..7b86026 --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_blue_radius_5.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_error.xml b/app/src/main/res/drawable/ic_error.xml new file mode 100644 index 0000000..3ee0260 --- /dev/null +++ b/app/src/main/res/drawable/ic_error.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_notice.xml b/app/src/main/res/drawable/ic_notice.xml new file mode 100644 index 0000000..962e03f --- /dev/null +++ b/app/src/main/res/drawable/ic_notice.xml @@ -0,0 +1,13 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_qr_code.xml b/app/src/main/res/drawable/ic_qr_code.xml index 43c8c42..3fc5935 100644 --- a/app/src/main/res/drawable/ic_qr_code.xml +++ b/app/src/main/res/drawable/ic_qr_code.xml @@ -5,8 +5,8 @@ android:viewportHeight="1024"> + android:pathData="M733.37,673.68H285.51a88.58,88.58 0,0 1,-88.58 -88.52v-149.56a88.58,88.58 0,0 1,88.58 -88.52h447.86a88.58,88.58 0,0 1,88.58 88.52v149.56a88.58,88.58 0,0 1,-88.58 88.52z" /> + android:pathData="M115.9,410.39A39.1,39.1 0,0 1,76.8 371.3L76.8,248.87A172.27,172.27 0,0 1,248.87 76.8L366.08,76.8a39.1,39.1 0,1 1,0 78.19L248.87,154.99a93.99,93.99 0,0 0,-93.89 93.89L154.99,371.3a39.1,39.1 0,0 1,-39.09 39.09zM371.31,942.08L248.87,942.08A172.27,172.27 0,0 1,76.8 770.01v-114.61a39.1,39.1 0,1 1,78.19 0v114.61a93.99,93.99 0,0 0,93.89 93.89h122.43a39.1,39.1 0,1 1,0 78.19zM770.01,942.08L652.8,942.08a39.1,39.1 0,1 1,0 -78.19h117.22a93.99,93.99 0,0 0,93.89 -93.89v-119.81a39.1,39.1 0,0 1,78.19 0v119.83A172.26,172.26 0,0 1,770.01 942.08zM902.99,410.39a39.1,39.1 0,0 1,-39.1 -39.09L863.89,248.87a93.99,93.99 0,0 0,-93.89 -93.89h-125.04a39.1,39.1 0,1 1,0 -78.19h125.04A172.27,172.27 0,0 1,942.08 248.87L942.08,371.3a39.1,39.1 0,0 1,-39.09 39.09zM717.94,551.14L300.94,551.14a39.1,39.1 0,0 1,0 -78.19h417a39.1,39.1 0,1 1,0 78.19z" /> diff --git a/app/src/main/res/drawable/ic_read_notice.xml b/app/src/main/res/drawable/ic_read_notice.xml new file mode 100644 index 0000000..fef5b72 --- /dev/null +++ b/app/src/main/res/drawable/ic_read_notice.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_right_black.xml b/app/src/main/res/drawable/ic_right_black.xml new file mode 100644 index 0000000..a25faa7 --- /dev/null +++ b/app/src/main/res/drawable/ic_right_black.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_notice_detail.xml b/app/src/main/res/layout/activity_notice_detail.xml new file mode 100644 index 0000000..25b055f --- /dev/null +++ b/app/src/main/res/layout/activity_notice_detail.xml @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_notice_list.xml b/app/src/main/res/layout/activity_notice_list.xml index 41d2ef1..8e224c0 100644 --- a/app/src/main/res/layout/activity_notice_list.xml +++ b/app/src/main/res/layout/activity_notice_list.xml @@ -1,6 +1,106 @@ + android:layout_height="match_parent" + android:background="@color/mainBackground" + android:orientation="vertical"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 97c55c3..0d85b90 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,6 +37,7 @@ + \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt b/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt new file mode 100644 index 0000000..722e4d1 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.xz.meterage.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.xz.meterage.R +import com.casic.xz.meterage.model.NoticeListModel + +class NoticeListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun getItemCount(): Int = dataRows.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_notice_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] +// holder.noticeTypeIconView.setImageResource() + holder.noticeTitleView.text = rowsBean.noticeTitle + holder.noticeDateView.text = rowsBean.noticeTime + holder.noticeContentView.text = rowsBean.noticeSketch + val state = if (rowsBean.isDel == 0) { + View.VISIBLE + } else { + View.INVISIBLE + } + holder.readStateView.visibility = state + + //绑定事件 + holder.itemView.setOnClickListener { + listener?.onItemClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var noticeTypeIconView: ImageView = view.findViewById(R.id.noticeTypeIconView) + var readStateView: View = view.findViewById(R.id.readStateView) + var noticeTitleView: TextView = view.findViewById(R.id.noticeTitleView) + var noticeDateView: TextView = view.findViewById(R.id.noticeDateView) + var noticeContentView: TextView = view.findViewById(R.id.noticeContentView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt b/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt new file mode 100644 index 0000000..016ebcb --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt @@ -0,0 +1,28 @@ +package com.casic.xz.meterage.extensions + +/** + * ArrayList扩展方法 + */ + +//将图片集合格式化成满足上传格式的数据 +fun ArrayList.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, s -> + if (index == this.size - 1) { + builder.append(s) + } else { + builder.append(s).append(",") + } + } + return builder.toString() +} + +fun addAll(vararg args: String): ArrayList { + val result = ArrayList() + args.forEach { + result.add(it) + } + return result +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 9b5faf6..b4628f3 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,8 +5,10 @@ import com.casic.xz.meterage.R import com.casic.xz.meterage.adapter.HomeGridAdapter import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo import kotlinx.android.synthetic.main.fragment_home.* class HomePageFragment : KotlinBaseFragment() { @@ -42,7 +44,9 @@ } override fun initEvent() { - + noticeLayout.setOnClickListener { + requireContext().navigatePageTo() + } } override fun initLayoutView(): Int = R.layout.fragment_home diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt index aaeb9df..7e75abe 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt @@ -4,9 +4,11 @@ import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.SaveKeyValues import kotlinx.android.synthetic.main.fragment_mine.* @@ -44,7 +46,9 @@ } override fun initEvent() { - + noticeLayout.setOnClickListener { + requireContext().navigatePageTo() + } } override fun initLayoutView(): Int = R.layout.fragment_mine diff --git a/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt new file mode 100644 index 0000000..a14ec4d --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt @@ -0,0 +1,56 @@ +package com.casic.xz.meterage.view + +import android.annotation.SuppressLint +import androidx.lifecycle.ViewModelProvider +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.vm.NoticeViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import kotlinx.android.synthetic.main.activity_notice_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +@SuppressLint("SetTextI18n") +class NoticeDetailActivity : KotlinBaseActivity() { + + private lateinit var noticeViewModel: NoticeViewModel + + override fun initData() { + leftBackView.setOnClickListener { finish() } + titleView.text = "通知公告" + + val args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + + noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + noticeViewModel.getNoticeList(args[0], args[1], args[2], "", "", 1) + noticeViewModel.noticeResult.observe(this, { + if (it.code == 200) { + val dataRow = it.data?.rows!![0] + + noticeDateView.text = dataRow.noticeTime + noticePublisherView.text = "发布人 ${dataRow.noticePublisher}" + noticeCompanyView.text = "发布单位 ${dataRow.noticeCompany}" + + noticeNoView.text = dataRow.noticeNo + noticeTitleView.text = dataRow.noticeTitle + noticeSketchView.text = dataRow.noticeSketch + } + }) + } + + override fun initEvent() { + + } + + override fun initLayoutView(): Int = R.layout.activity_notice_detail + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt index 6dde53b..3c90012 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt @@ -1,20 +1,163 @@ package com.casic.xz.meterage.view +import android.os.Handler +import android.view.View import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.adapter.NoticeListAdapter +import com.casic.xz.meterage.extensions.addAll +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.NoticeListModel import com.casic.xz.meterage.vm.NoticeViewModel +import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.activity_notice_list.* +import kotlinx.android.synthetic.main.include_empty_view.* class NoticeListActivity : KotlinBaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var noticeViewModel: NoticeViewModel + private lateinit var noticeListAdapter: NoticeListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + noticeViewModel.noticeResult.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows!! +// countBadeNumber(dataRows) + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + noticeLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows) + noticeLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023013101) + } + }) } override fun initEvent() { + leftBackView.setOnClickListener { finish() } + rightOperateView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("确定将所有未读消息标为已读?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + } + + override fun onConfirmClick() { + //TODO 设置为已读 + } + }).build().show() + } + + if (hasNoticePermission()) { + openSystemNoticeLayout.visibility = View.GONE + openSystemNoticeLayout.visibility = View.GONE + } else { + openSystemNoticeLayout.setOnClickListener { + + } + + + closeLayoutView.setOnClickListener { + openSystemNoticeLayout.visibility = View.GONE + } + } + + noticeLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getNoticeListByPage() + } + + noticeLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getNoticeListByPage() + } + } + + override fun onResume() { + super.onResume() + getNoticeListByPage() + } + + private fun getNoticeListByPage() { + noticeViewModel.getNoticeList("", "", "", "", "", pageIndex) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023013101 -> { + if (isRefresh || isLoadMore) { + noticeListAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有任何消息") { + pageIndex = 1 + getNoticeListByPage() + } + } else { + emptyView!!.hide() + noticeListAdapter = NoticeListAdapter(this, dataBeans) + noticeRecyclerView.adapter = noticeListAdapter + noticeListAdapter.setOnItemClickListener(object : + NoticeListAdapter.OnItemClickListener { + override fun onItemClicked(position: Int) { + val rowsModel = dataBeans[position] + val allArgs = addAll( + rowsModel.noticeNo, + rowsModel.noticeTitle, + rowsModel.noticePublisher, + "", + "" + ) + navigatePageTo(allArgs) + } + }) + } + } + } + } + true + } + + //TODO 判断是否开启通知权限 + private fun hasNoticePermission(): Boolean { + + return false } override fun initLayoutView(): Int = R.layout.activity_notice_list @@ -24,6 +167,7 @@ } override fun setupTopBarLayout() { - + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) } } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_blue_radius_5.xml b/app/src/main/res/drawable/bg_solid_layout_blue_radius_5.xml new file mode 100644 index 0000000..7b86026 --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_blue_radius_5.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_error.xml b/app/src/main/res/drawable/ic_error.xml new file mode 100644 index 0000000..3ee0260 --- /dev/null +++ b/app/src/main/res/drawable/ic_error.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_notice.xml b/app/src/main/res/drawable/ic_notice.xml new file mode 100644 index 0000000..962e03f --- /dev/null +++ b/app/src/main/res/drawable/ic_notice.xml @@ -0,0 +1,13 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_qr_code.xml b/app/src/main/res/drawable/ic_qr_code.xml index 43c8c42..3fc5935 100644 --- a/app/src/main/res/drawable/ic_qr_code.xml +++ b/app/src/main/res/drawable/ic_qr_code.xml @@ -5,8 +5,8 @@ android:viewportHeight="1024"> + android:pathData="M733.37,673.68H285.51a88.58,88.58 0,0 1,-88.58 -88.52v-149.56a88.58,88.58 0,0 1,88.58 -88.52h447.86a88.58,88.58 0,0 1,88.58 88.52v149.56a88.58,88.58 0,0 1,-88.58 88.52z" /> + android:pathData="M115.9,410.39A39.1,39.1 0,0 1,76.8 371.3L76.8,248.87A172.27,172.27 0,0 1,248.87 76.8L366.08,76.8a39.1,39.1 0,1 1,0 78.19L248.87,154.99a93.99,93.99 0,0 0,-93.89 93.89L154.99,371.3a39.1,39.1 0,0 1,-39.09 39.09zM371.31,942.08L248.87,942.08A172.27,172.27 0,0 1,76.8 770.01v-114.61a39.1,39.1 0,1 1,78.19 0v114.61a93.99,93.99 0,0 0,93.89 93.89h122.43a39.1,39.1 0,1 1,0 78.19zM770.01,942.08L652.8,942.08a39.1,39.1 0,1 1,0 -78.19h117.22a93.99,93.99 0,0 0,93.89 -93.89v-119.81a39.1,39.1 0,0 1,78.19 0v119.83A172.26,172.26 0,0 1,770.01 942.08zM902.99,410.39a39.1,39.1 0,0 1,-39.1 -39.09L863.89,248.87a93.99,93.99 0,0 0,-93.89 -93.89h-125.04a39.1,39.1 0,1 1,0 -78.19h125.04A172.27,172.27 0,0 1,942.08 248.87L942.08,371.3a39.1,39.1 0,0 1,-39.09 39.09zM717.94,551.14L300.94,551.14a39.1,39.1 0,0 1,0 -78.19h417a39.1,39.1 0,1 1,0 78.19z" /> diff --git a/app/src/main/res/drawable/ic_read_notice.xml b/app/src/main/res/drawable/ic_read_notice.xml new file mode 100644 index 0000000..fef5b72 --- /dev/null +++ b/app/src/main/res/drawable/ic_read_notice.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_right_black.xml b/app/src/main/res/drawable/ic_right_black.xml new file mode 100644 index 0000000..a25faa7 --- /dev/null +++ b/app/src/main/res/drawable/ic_right_black.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_notice_detail.xml b/app/src/main/res/layout/activity_notice_detail.xml new file mode 100644 index 0000000..25b055f --- /dev/null +++ b/app/src/main/res/layout/activity_notice_detail.xml @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_notice_list.xml b/app/src/main/res/layout/activity_notice_list.xml index 41d2ef1..8e224c0 100644 --- a/app/src/main/res/layout/activity_notice_list.xml +++ b/app/src/main/res/layout/activity_notice_list.xml @@ -1,6 +1,106 @@ + android:layout_height="match_parent" + android:background="@color/mainBackground" + android:orientation="vertical"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 8d76acb..41b32a9 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -44,6 +44,7 @@ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 97c55c3..0d85b90 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,6 +37,7 @@ + \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt b/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt new file mode 100644 index 0000000..722e4d1 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.xz.meterage.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.xz.meterage.R +import com.casic.xz.meterage.model.NoticeListModel + +class NoticeListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun getItemCount(): Int = dataRows.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_notice_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] +// holder.noticeTypeIconView.setImageResource() + holder.noticeTitleView.text = rowsBean.noticeTitle + holder.noticeDateView.text = rowsBean.noticeTime + holder.noticeContentView.text = rowsBean.noticeSketch + val state = if (rowsBean.isDel == 0) { + View.VISIBLE + } else { + View.INVISIBLE + } + holder.readStateView.visibility = state + + //绑定事件 + holder.itemView.setOnClickListener { + listener?.onItemClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var noticeTypeIconView: ImageView = view.findViewById(R.id.noticeTypeIconView) + var readStateView: View = view.findViewById(R.id.readStateView) + var noticeTitleView: TextView = view.findViewById(R.id.noticeTitleView) + var noticeDateView: TextView = view.findViewById(R.id.noticeDateView) + var noticeContentView: TextView = view.findViewById(R.id.noticeContentView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt b/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt new file mode 100644 index 0000000..016ebcb --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt @@ -0,0 +1,28 @@ +package com.casic.xz.meterage.extensions + +/** + * ArrayList扩展方法 + */ + +//将图片集合格式化成满足上传格式的数据 +fun ArrayList.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, s -> + if (index == this.size - 1) { + builder.append(s) + } else { + builder.append(s).append(",") + } + } + return builder.toString() +} + +fun addAll(vararg args: String): ArrayList { + val result = ArrayList() + args.forEach { + result.add(it) + } + return result +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 9b5faf6..b4628f3 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,8 +5,10 @@ import com.casic.xz.meterage.R import com.casic.xz.meterage.adapter.HomeGridAdapter import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo import kotlinx.android.synthetic.main.fragment_home.* class HomePageFragment : KotlinBaseFragment() { @@ -42,7 +44,9 @@ } override fun initEvent() { - + noticeLayout.setOnClickListener { + requireContext().navigatePageTo() + } } override fun initLayoutView(): Int = R.layout.fragment_home diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt index aaeb9df..7e75abe 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt @@ -4,9 +4,11 @@ import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.SaveKeyValues import kotlinx.android.synthetic.main.fragment_mine.* @@ -44,7 +46,9 @@ } override fun initEvent() { - + noticeLayout.setOnClickListener { + requireContext().navigatePageTo() + } } override fun initLayoutView(): Int = R.layout.fragment_mine diff --git a/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt new file mode 100644 index 0000000..a14ec4d --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt @@ -0,0 +1,56 @@ +package com.casic.xz.meterage.view + +import android.annotation.SuppressLint +import androidx.lifecycle.ViewModelProvider +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.vm.NoticeViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import kotlinx.android.synthetic.main.activity_notice_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +@SuppressLint("SetTextI18n") +class NoticeDetailActivity : KotlinBaseActivity() { + + private lateinit var noticeViewModel: NoticeViewModel + + override fun initData() { + leftBackView.setOnClickListener { finish() } + titleView.text = "通知公告" + + val args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + + noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + noticeViewModel.getNoticeList(args[0], args[1], args[2], "", "", 1) + noticeViewModel.noticeResult.observe(this, { + if (it.code == 200) { + val dataRow = it.data?.rows!![0] + + noticeDateView.text = dataRow.noticeTime + noticePublisherView.text = "发布人 ${dataRow.noticePublisher}" + noticeCompanyView.text = "发布单位 ${dataRow.noticeCompany}" + + noticeNoView.text = dataRow.noticeNo + noticeTitleView.text = dataRow.noticeTitle + noticeSketchView.text = dataRow.noticeSketch + } + }) + } + + override fun initEvent() { + + } + + override fun initLayoutView(): Int = R.layout.activity_notice_detail + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt index 6dde53b..3c90012 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt @@ -1,20 +1,163 @@ package com.casic.xz.meterage.view +import android.os.Handler +import android.view.View import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.adapter.NoticeListAdapter +import com.casic.xz.meterage.extensions.addAll +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.NoticeListModel import com.casic.xz.meterage.vm.NoticeViewModel +import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.activity_notice_list.* +import kotlinx.android.synthetic.main.include_empty_view.* class NoticeListActivity : KotlinBaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var noticeViewModel: NoticeViewModel + private lateinit var noticeListAdapter: NoticeListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + noticeViewModel.noticeResult.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows!! +// countBadeNumber(dataRows) + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + noticeLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows) + noticeLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023013101) + } + }) } override fun initEvent() { + leftBackView.setOnClickListener { finish() } + rightOperateView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("确定将所有未读消息标为已读?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + } + + override fun onConfirmClick() { + //TODO 设置为已读 + } + }).build().show() + } + + if (hasNoticePermission()) { + openSystemNoticeLayout.visibility = View.GONE + openSystemNoticeLayout.visibility = View.GONE + } else { + openSystemNoticeLayout.setOnClickListener { + + } + + + closeLayoutView.setOnClickListener { + openSystemNoticeLayout.visibility = View.GONE + } + } + + noticeLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getNoticeListByPage() + } + + noticeLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getNoticeListByPage() + } + } + + override fun onResume() { + super.onResume() + getNoticeListByPage() + } + + private fun getNoticeListByPage() { + noticeViewModel.getNoticeList("", "", "", "", "", pageIndex) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023013101 -> { + if (isRefresh || isLoadMore) { + noticeListAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有任何消息") { + pageIndex = 1 + getNoticeListByPage() + } + } else { + emptyView!!.hide() + noticeListAdapter = NoticeListAdapter(this, dataBeans) + noticeRecyclerView.adapter = noticeListAdapter + noticeListAdapter.setOnItemClickListener(object : + NoticeListAdapter.OnItemClickListener { + override fun onItemClicked(position: Int) { + val rowsModel = dataBeans[position] + val allArgs = addAll( + rowsModel.noticeNo, + rowsModel.noticeTitle, + rowsModel.noticePublisher, + "", + "" + ) + navigatePageTo(allArgs) + } + }) + } + } + } + } + true + } + + //TODO 判断是否开启通知权限 + private fun hasNoticePermission(): Boolean { + + return false } override fun initLayoutView(): Int = R.layout.activity_notice_list @@ -24,6 +167,7 @@ } override fun setupTopBarLayout() { - + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) } } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_blue_radius_5.xml b/app/src/main/res/drawable/bg_solid_layout_blue_radius_5.xml new file mode 100644 index 0000000..7b86026 --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_blue_radius_5.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_error.xml b/app/src/main/res/drawable/ic_error.xml new file mode 100644 index 0000000..3ee0260 --- /dev/null +++ b/app/src/main/res/drawable/ic_error.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_notice.xml b/app/src/main/res/drawable/ic_notice.xml new file mode 100644 index 0000000..962e03f --- /dev/null +++ b/app/src/main/res/drawable/ic_notice.xml @@ -0,0 +1,13 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_qr_code.xml b/app/src/main/res/drawable/ic_qr_code.xml index 43c8c42..3fc5935 100644 --- a/app/src/main/res/drawable/ic_qr_code.xml +++ b/app/src/main/res/drawable/ic_qr_code.xml @@ -5,8 +5,8 @@ android:viewportHeight="1024"> + android:pathData="M733.37,673.68H285.51a88.58,88.58 0,0 1,-88.58 -88.52v-149.56a88.58,88.58 0,0 1,88.58 -88.52h447.86a88.58,88.58 0,0 1,88.58 88.52v149.56a88.58,88.58 0,0 1,-88.58 88.52z" /> + android:pathData="M115.9,410.39A39.1,39.1 0,0 1,76.8 371.3L76.8,248.87A172.27,172.27 0,0 1,248.87 76.8L366.08,76.8a39.1,39.1 0,1 1,0 78.19L248.87,154.99a93.99,93.99 0,0 0,-93.89 93.89L154.99,371.3a39.1,39.1 0,0 1,-39.09 39.09zM371.31,942.08L248.87,942.08A172.27,172.27 0,0 1,76.8 770.01v-114.61a39.1,39.1 0,1 1,78.19 0v114.61a93.99,93.99 0,0 0,93.89 93.89h122.43a39.1,39.1 0,1 1,0 78.19zM770.01,942.08L652.8,942.08a39.1,39.1 0,1 1,0 -78.19h117.22a93.99,93.99 0,0 0,93.89 -93.89v-119.81a39.1,39.1 0,0 1,78.19 0v119.83A172.26,172.26 0,0 1,770.01 942.08zM902.99,410.39a39.1,39.1 0,0 1,-39.1 -39.09L863.89,248.87a93.99,93.99 0,0 0,-93.89 -93.89h-125.04a39.1,39.1 0,1 1,0 -78.19h125.04A172.27,172.27 0,0 1,942.08 248.87L942.08,371.3a39.1,39.1 0,0 1,-39.09 39.09zM717.94,551.14L300.94,551.14a39.1,39.1 0,0 1,0 -78.19h417a39.1,39.1 0,1 1,0 78.19z" /> diff --git a/app/src/main/res/drawable/ic_read_notice.xml b/app/src/main/res/drawable/ic_read_notice.xml new file mode 100644 index 0000000..fef5b72 --- /dev/null +++ b/app/src/main/res/drawable/ic_read_notice.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_right_black.xml b/app/src/main/res/drawable/ic_right_black.xml new file mode 100644 index 0000000..a25faa7 --- /dev/null +++ b/app/src/main/res/drawable/ic_right_black.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_notice_detail.xml b/app/src/main/res/layout/activity_notice_detail.xml new file mode 100644 index 0000000..25b055f --- /dev/null +++ b/app/src/main/res/layout/activity_notice_detail.xml @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_notice_list.xml b/app/src/main/res/layout/activity_notice_list.xml index 41d2ef1..8e224c0 100644 --- a/app/src/main/res/layout/activity_notice_list.xml +++ b/app/src/main/res/layout/activity_notice_list.xml @@ -1,6 +1,106 @@ + android:layout_height="match_parent" + android:background="@color/mainBackground" + android:orientation="vertical"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 8d76acb..41b32a9 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -44,6 +44,7 @@ diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml index 4b89b9d..0643064 100644 --- a/app/src/main/res/layout/fragment_mine.xml +++ b/app/src/main/res/layout/fragment_mine.xml @@ -49,9 +49,10 @@ android:textSize="@dimen/sp_22" /> + android:layout_height="wrap_content" + android:layout_alignParentEnd="true"> + \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt b/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt new file mode 100644 index 0000000..722e4d1 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.xz.meterage.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.xz.meterage.R +import com.casic.xz.meterage.model.NoticeListModel + +class NoticeListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun getItemCount(): Int = dataRows.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_notice_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] +// holder.noticeTypeIconView.setImageResource() + holder.noticeTitleView.text = rowsBean.noticeTitle + holder.noticeDateView.text = rowsBean.noticeTime + holder.noticeContentView.text = rowsBean.noticeSketch + val state = if (rowsBean.isDel == 0) { + View.VISIBLE + } else { + View.INVISIBLE + } + holder.readStateView.visibility = state + + //绑定事件 + holder.itemView.setOnClickListener { + listener?.onItemClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var noticeTypeIconView: ImageView = view.findViewById(R.id.noticeTypeIconView) + var readStateView: View = view.findViewById(R.id.readStateView) + var noticeTitleView: TextView = view.findViewById(R.id.noticeTitleView) + var noticeDateView: TextView = view.findViewById(R.id.noticeDateView) + var noticeContentView: TextView = view.findViewById(R.id.noticeContentView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt b/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt new file mode 100644 index 0000000..016ebcb --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt @@ -0,0 +1,28 @@ +package com.casic.xz.meterage.extensions + +/** + * ArrayList扩展方法 + */ + +//将图片集合格式化成满足上传格式的数据 +fun ArrayList.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, s -> + if (index == this.size - 1) { + builder.append(s) + } else { + builder.append(s).append(",") + } + } + return builder.toString() +} + +fun addAll(vararg args: String): ArrayList { + val result = ArrayList() + args.forEach { + result.add(it) + } + return result +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 9b5faf6..b4628f3 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,8 +5,10 @@ import com.casic.xz.meterage.R import com.casic.xz.meterage.adapter.HomeGridAdapter import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo import kotlinx.android.synthetic.main.fragment_home.* class HomePageFragment : KotlinBaseFragment() { @@ -42,7 +44,9 @@ } override fun initEvent() { - + noticeLayout.setOnClickListener { + requireContext().navigatePageTo() + } } override fun initLayoutView(): Int = R.layout.fragment_home diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt index aaeb9df..7e75abe 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt @@ -4,9 +4,11 @@ import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.SaveKeyValues import kotlinx.android.synthetic.main.fragment_mine.* @@ -44,7 +46,9 @@ } override fun initEvent() { - + noticeLayout.setOnClickListener { + requireContext().navigatePageTo() + } } override fun initLayoutView(): Int = R.layout.fragment_mine diff --git a/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt new file mode 100644 index 0000000..a14ec4d --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt @@ -0,0 +1,56 @@ +package com.casic.xz.meterage.view + +import android.annotation.SuppressLint +import androidx.lifecycle.ViewModelProvider +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.vm.NoticeViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import kotlinx.android.synthetic.main.activity_notice_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +@SuppressLint("SetTextI18n") +class NoticeDetailActivity : KotlinBaseActivity() { + + private lateinit var noticeViewModel: NoticeViewModel + + override fun initData() { + leftBackView.setOnClickListener { finish() } + titleView.text = "通知公告" + + val args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + + noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + noticeViewModel.getNoticeList(args[0], args[1], args[2], "", "", 1) + noticeViewModel.noticeResult.observe(this, { + if (it.code == 200) { + val dataRow = it.data?.rows!![0] + + noticeDateView.text = dataRow.noticeTime + noticePublisherView.text = "发布人 ${dataRow.noticePublisher}" + noticeCompanyView.text = "发布单位 ${dataRow.noticeCompany}" + + noticeNoView.text = dataRow.noticeNo + noticeTitleView.text = dataRow.noticeTitle + noticeSketchView.text = dataRow.noticeSketch + } + }) + } + + override fun initEvent() { + + } + + override fun initLayoutView(): Int = R.layout.activity_notice_detail + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt index 6dde53b..3c90012 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt @@ -1,20 +1,163 @@ package com.casic.xz.meterage.view +import android.os.Handler +import android.view.View import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.adapter.NoticeListAdapter +import com.casic.xz.meterage.extensions.addAll +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.NoticeListModel import com.casic.xz.meterage.vm.NoticeViewModel +import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.activity_notice_list.* +import kotlinx.android.synthetic.main.include_empty_view.* class NoticeListActivity : KotlinBaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var noticeViewModel: NoticeViewModel + private lateinit var noticeListAdapter: NoticeListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + noticeViewModel.noticeResult.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows!! +// countBadeNumber(dataRows) + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + noticeLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows) + noticeLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023013101) + } + }) } override fun initEvent() { + leftBackView.setOnClickListener { finish() } + rightOperateView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("确定将所有未读消息标为已读?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + } + + override fun onConfirmClick() { + //TODO 设置为已读 + } + }).build().show() + } + + if (hasNoticePermission()) { + openSystemNoticeLayout.visibility = View.GONE + openSystemNoticeLayout.visibility = View.GONE + } else { + openSystemNoticeLayout.setOnClickListener { + + } + + + closeLayoutView.setOnClickListener { + openSystemNoticeLayout.visibility = View.GONE + } + } + + noticeLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getNoticeListByPage() + } + + noticeLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getNoticeListByPage() + } + } + + override fun onResume() { + super.onResume() + getNoticeListByPage() + } + + private fun getNoticeListByPage() { + noticeViewModel.getNoticeList("", "", "", "", "", pageIndex) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023013101 -> { + if (isRefresh || isLoadMore) { + noticeListAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有任何消息") { + pageIndex = 1 + getNoticeListByPage() + } + } else { + emptyView!!.hide() + noticeListAdapter = NoticeListAdapter(this, dataBeans) + noticeRecyclerView.adapter = noticeListAdapter + noticeListAdapter.setOnItemClickListener(object : + NoticeListAdapter.OnItemClickListener { + override fun onItemClicked(position: Int) { + val rowsModel = dataBeans[position] + val allArgs = addAll( + rowsModel.noticeNo, + rowsModel.noticeTitle, + rowsModel.noticePublisher, + "", + "" + ) + navigatePageTo(allArgs) + } + }) + } + } + } + } + true + } + + //TODO 判断是否开启通知权限 + private fun hasNoticePermission(): Boolean { + + return false } override fun initLayoutView(): Int = R.layout.activity_notice_list @@ -24,6 +167,7 @@ } override fun setupTopBarLayout() { - + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) } } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_blue_radius_5.xml b/app/src/main/res/drawable/bg_solid_layout_blue_radius_5.xml new file mode 100644 index 0000000..7b86026 --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_blue_radius_5.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_error.xml b/app/src/main/res/drawable/ic_error.xml new file mode 100644 index 0000000..3ee0260 --- /dev/null +++ b/app/src/main/res/drawable/ic_error.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_notice.xml b/app/src/main/res/drawable/ic_notice.xml new file mode 100644 index 0000000..962e03f --- /dev/null +++ b/app/src/main/res/drawable/ic_notice.xml @@ -0,0 +1,13 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_qr_code.xml b/app/src/main/res/drawable/ic_qr_code.xml index 43c8c42..3fc5935 100644 --- a/app/src/main/res/drawable/ic_qr_code.xml +++ b/app/src/main/res/drawable/ic_qr_code.xml @@ -5,8 +5,8 @@ android:viewportHeight="1024"> + android:pathData="M733.37,673.68H285.51a88.58,88.58 0,0 1,-88.58 -88.52v-149.56a88.58,88.58 0,0 1,88.58 -88.52h447.86a88.58,88.58 0,0 1,88.58 88.52v149.56a88.58,88.58 0,0 1,-88.58 88.52z" /> + android:pathData="M115.9,410.39A39.1,39.1 0,0 1,76.8 371.3L76.8,248.87A172.27,172.27 0,0 1,248.87 76.8L366.08,76.8a39.1,39.1 0,1 1,0 78.19L248.87,154.99a93.99,93.99 0,0 0,-93.89 93.89L154.99,371.3a39.1,39.1 0,0 1,-39.09 39.09zM371.31,942.08L248.87,942.08A172.27,172.27 0,0 1,76.8 770.01v-114.61a39.1,39.1 0,1 1,78.19 0v114.61a93.99,93.99 0,0 0,93.89 93.89h122.43a39.1,39.1 0,1 1,0 78.19zM770.01,942.08L652.8,942.08a39.1,39.1 0,1 1,0 -78.19h117.22a93.99,93.99 0,0 0,93.89 -93.89v-119.81a39.1,39.1 0,0 1,78.19 0v119.83A172.26,172.26 0,0 1,770.01 942.08zM902.99,410.39a39.1,39.1 0,0 1,-39.1 -39.09L863.89,248.87a93.99,93.99 0,0 0,-93.89 -93.89h-125.04a39.1,39.1 0,1 1,0 -78.19h125.04A172.27,172.27 0,0 1,942.08 248.87L942.08,371.3a39.1,39.1 0,0 1,-39.09 39.09zM717.94,551.14L300.94,551.14a39.1,39.1 0,0 1,0 -78.19h417a39.1,39.1 0,1 1,0 78.19z" /> diff --git a/app/src/main/res/drawable/ic_read_notice.xml b/app/src/main/res/drawable/ic_read_notice.xml new file mode 100644 index 0000000..fef5b72 --- /dev/null +++ b/app/src/main/res/drawable/ic_read_notice.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_right_black.xml b/app/src/main/res/drawable/ic_right_black.xml new file mode 100644 index 0000000..a25faa7 --- /dev/null +++ b/app/src/main/res/drawable/ic_right_black.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_notice_detail.xml b/app/src/main/res/layout/activity_notice_detail.xml new file mode 100644 index 0000000..25b055f --- /dev/null +++ b/app/src/main/res/layout/activity_notice_detail.xml @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_notice_list.xml b/app/src/main/res/layout/activity_notice_list.xml index 41d2ef1..8e224c0 100644 --- a/app/src/main/res/layout/activity_notice_list.xml +++ b/app/src/main/res/layout/activity_notice_list.xml @@ -1,6 +1,106 @@ + android:layout_height="match_parent" + android:background="@color/mainBackground" + android:orientation="vertical"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 8d76acb..41b32a9 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -44,6 +44,7 @@ diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml index 4b89b9d..0643064 100644 --- a/app/src/main/res/layout/fragment_mine.xml +++ b/app/src/main/res/layout/fragment_mine.xml @@ -49,9 +49,10 @@ android:textSize="@dimen/sp_22" /> + android:layout_height="wrap_content" + android:layout_alignParentEnd="true"> + + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 97c55c3..0d85b90 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,6 +37,7 @@ + \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt b/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt new file mode 100644 index 0000000..722e4d1 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.xz.meterage.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.xz.meterage.R +import com.casic.xz.meterage.model.NoticeListModel + +class NoticeListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun getItemCount(): Int = dataRows.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_notice_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] +// holder.noticeTypeIconView.setImageResource() + holder.noticeTitleView.text = rowsBean.noticeTitle + holder.noticeDateView.text = rowsBean.noticeTime + holder.noticeContentView.text = rowsBean.noticeSketch + val state = if (rowsBean.isDel == 0) { + View.VISIBLE + } else { + View.INVISIBLE + } + holder.readStateView.visibility = state + + //绑定事件 + holder.itemView.setOnClickListener { + listener?.onItemClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var noticeTypeIconView: ImageView = view.findViewById(R.id.noticeTypeIconView) + var readStateView: View = view.findViewById(R.id.readStateView) + var noticeTitleView: TextView = view.findViewById(R.id.noticeTitleView) + var noticeDateView: TextView = view.findViewById(R.id.noticeDateView) + var noticeContentView: TextView = view.findViewById(R.id.noticeContentView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt b/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt new file mode 100644 index 0000000..016ebcb --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt @@ -0,0 +1,28 @@ +package com.casic.xz.meterage.extensions + +/** + * ArrayList扩展方法 + */ + +//将图片集合格式化成满足上传格式的数据 +fun ArrayList.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, s -> + if (index == this.size - 1) { + builder.append(s) + } else { + builder.append(s).append(",") + } + } + return builder.toString() +} + +fun addAll(vararg args: String): ArrayList { + val result = ArrayList() + args.forEach { + result.add(it) + } + return result +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 9b5faf6..b4628f3 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,8 +5,10 @@ import com.casic.xz.meterage.R import com.casic.xz.meterage.adapter.HomeGridAdapter import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo import kotlinx.android.synthetic.main.fragment_home.* class HomePageFragment : KotlinBaseFragment() { @@ -42,7 +44,9 @@ } override fun initEvent() { - + noticeLayout.setOnClickListener { + requireContext().navigatePageTo() + } } override fun initLayoutView(): Int = R.layout.fragment_home diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt index aaeb9df..7e75abe 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt @@ -4,9 +4,11 @@ import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.SaveKeyValues import kotlinx.android.synthetic.main.fragment_mine.* @@ -44,7 +46,9 @@ } override fun initEvent() { - + noticeLayout.setOnClickListener { + requireContext().navigatePageTo() + } } override fun initLayoutView(): Int = R.layout.fragment_mine diff --git a/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt new file mode 100644 index 0000000..a14ec4d --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt @@ -0,0 +1,56 @@ +package com.casic.xz.meterage.view + +import android.annotation.SuppressLint +import androidx.lifecycle.ViewModelProvider +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.vm.NoticeViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import kotlinx.android.synthetic.main.activity_notice_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +@SuppressLint("SetTextI18n") +class NoticeDetailActivity : KotlinBaseActivity() { + + private lateinit var noticeViewModel: NoticeViewModel + + override fun initData() { + leftBackView.setOnClickListener { finish() } + titleView.text = "通知公告" + + val args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + + noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + noticeViewModel.getNoticeList(args[0], args[1], args[2], "", "", 1) + noticeViewModel.noticeResult.observe(this, { + if (it.code == 200) { + val dataRow = it.data?.rows!![0] + + noticeDateView.text = dataRow.noticeTime + noticePublisherView.text = "发布人 ${dataRow.noticePublisher}" + noticeCompanyView.text = "发布单位 ${dataRow.noticeCompany}" + + noticeNoView.text = dataRow.noticeNo + noticeTitleView.text = dataRow.noticeTitle + noticeSketchView.text = dataRow.noticeSketch + } + }) + } + + override fun initEvent() { + + } + + override fun initLayoutView(): Int = R.layout.activity_notice_detail + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt index 6dde53b..3c90012 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt @@ -1,20 +1,163 @@ package com.casic.xz.meterage.view +import android.os.Handler +import android.view.View import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.adapter.NoticeListAdapter +import com.casic.xz.meterage.extensions.addAll +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.NoticeListModel import com.casic.xz.meterage.vm.NoticeViewModel +import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.activity_notice_list.* +import kotlinx.android.synthetic.main.include_empty_view.* class NoticeListActivity : KotlinBaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var noticeViewModel: NoticeViewModel + private lateinit var noticeListAdapter: NoticeListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + noticeViewModel.noticeResult.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows!! +// countBadeNumber(dataRows) + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + noticeLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows) + noticeLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023013101) + } + }) } override fun initEvent() { + leftBackView.setOnClickListener { finish() } + rightOperateView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("确定将所有未读消息标为已读?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + } + + override fun onConfirmClick() { + //TODO 设置为已读 + } + }).build().show() + } + + if (hasNoticePermission()) { + openSystemNoticeLayout.visibility = View.GONE + openSystemNoticeLayout.visibility = View.GONE + } else { + openSystemNoticeLayout.setOnClickListener { + + } + + + closeLayoutView.setOnClickListener { + openSystemNoticeLayout.visibility = View.GONE + } + } + + noticeLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getNoticeListByPage() + } + + noticeLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getNoticeListByPage() + } + } + + override fun onResume() { + super.onResume() + getNoticeListByPage() + } + + private fun getNoticeListByPage() { + noticeViewModel.getNoticeList("", "", "", "", "", pageIndex) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023013101 -> { + if (isRefresh || isLoadMore) { + noticeListAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有任何消息") { + pageIndex = 1 + getNoticeListByPage() + } + } else { + emptyView!!.hide() + noticeListAdapter = NoticeListAdapter(this, dataBeans) + noticeRecyclerView.adapter = noticeListAdapter + noticeListAdapter.setOnItemClickListener(object : + NoticeListAdapter.OnItemClickListener { + override fun onItemClicked(position: Int) { + val rowsModel = dataBeans[position] + val allArgs = addAll( + rowsModel.noticeNo, + rowsModel.noticeTitle, + rowsModel.noticePublisher, + "", + "" + ) + navigatePageTo(allArgs) + } + }) + } + } + } + } + true + } + + //TODO 判断是否开启通知权限 + private fun hasNoticePermission(): Boolean { + + return false } override fun initLayoutView(): Int = R.layout.activity_notice_list @@ -24,6 +167,7 @@ } override fun setupTopBarLayout() { - + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) } } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_blue_radius_5.xml b/app/src/main/res/drawable/bg_solid_layout_blue_radius_5.xml new file mode 100644 index 0000000..7b86026 --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_blue_radius_5.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_error.xml b/app/src/main/res/drawable/ic_error.xml new file mode 100644 index 0000000..3ee0260 --- /dev/null +++ b/app/src/main/res/drawable/ic_error.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_notice.xml b/app/src/main/res/drawable/ic_notice.xml new file mode 100644 index 0000000..962e03f --- /dev/null +++ b/app/src/main/res/drawable/ic_notice.xml @@ -0,0 +1,13 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_qr_code.xml b/app/src/main/res/drawable/ic_qr_code.xml index 43c8c42..3fc5935 100644 --- a/app/src/main/res/drawable/ic_qr_code.xml +++ b/app/src/main/res/drawable/ic_qr_code.xml @@ -5,8 +5,8 @@ android:viewportHeight="1024"> + android:pathData="M733.37,673.68H285.51a88.58,88.58 0,0 1,-88.58 -88.52v-149.56a88.58,88.58 0,0 1,88.58 -88.52h447.86a88.58,88.58 0,0 1,88.58 88.52v149.56a88.58,88.58 0,0 1,-88.58 88.52z" /> + android:pathData="M115.9,410.39A39.1,39.1 0,0 1,76.8 371.3L76.8,248.87A172.27,172.27 0,0 1,248.87 76.8L366.08,76.8a39.1,39.1 0,1 1,0 78.19L248.87,154.99a93.99,93.99 0,0 0,-93.89 93.89L154.99,371.3a39.1,39.1 0,0 1,-39.09 39.09zM371.31,942.08L248.87,942.08A172.27,172.27 0,0 1,76.8 770.01v-114.61a39.1,39.1 0,1 1,78.19 0v114.61a93.99,93.99 0,0 0,93.89 93.89h122.43a39.1,39.1 0,1 1,0 78.19zM770.01,942.08L652.8,942.08a39.1,39.1 0,1 1,0 -78.19h117.22a93.99,93.99 0,0 0,93.89 -93.89v-119.81a39.1,39.1 0,0 1,78.19 0v119.83A172.26,172.26 0,0 1,770.01 942.08zM902.99,410.39a39.1,39.1 0,0 1,-39.1 -39.09L863.89,248.87a93.99,93.99 0,0 0,-93.89 -93.89h-125.04a39.1,39.1 0,1 1,0 -78.19h125.04A172.27,172.27 0,0 1,942.08 248.87L942.08,371.3a39.1,39.1 0,0 1,-39.09 39.09zM717.94,551.14L300.94,551.14a39.1,39.1 0,0 1,0 -78.19h417a39.1,39.1 0,1 1,0 78.19z" /> diff --git a/app/src/main/res/drawable/ic_read_notice.xml b/app/src/main/res/drawable/ic_read_notice.xml new file mode 100644 index 0000000..fef5b72 --- /dev/null +++ b/app/src/main/res/drawable/ic_read_notice.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_right_black.xml b/app/src/main/res/drawable/ic_right_black.xml new file mode 100644 index 0000000..a25faa7 --- /dev/null +++ b/app/src/main/res/drawable/ic_right_black.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_notice_detail.xml b/app/src/main/res/layout/activity_notice_detail.xml new file mode 100644 index 0000000..25b055f --- /dev/null +++ b/app/src/main/res/layout/activity_notice_detail.xml @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_notice_list.xml b/app/src/main/res/layout/activity_notice_list.xml index 41d2ef1..8e224c0 100644 --- a/app/src/main/res/layout/activity_notice_list.xml +++ b/app/src/main/res/layout/activity_notice_list.xml @@ -1,6 +1,106 @@ + android:layout_height="match_parent" + android:background="@color/mainBackground" + android:orientation="vertical"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 8d76acb..41b32a9 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -44,6 +44,7 @@ diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml index 4b89b9d..0643064 100644 --- a/app/src/main/res/layout/fragment_mine.xml +++ b/app/src/main/res/layout/fragment_mine.xml @@ -49,9 +49,10 @@ android:textSize="@dimen/sp_22" /> + android:layout_height="wrap_content" + android:layout_alignParentEnd="true"> + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/include_empty_view.xml b/app/src/main/res/layout/include_empty_view.xml new file mode 100644 index 0000000..37de024 --- /dev/null +++ b/app/src/main/res/layout/include_empty_view.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 97c55c3..0d85b90 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,6 +37,7 @@ + \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt b/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt new file mode 100644 index 0000000..722e4d1 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.xz.meterage.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.xz.meterage.R +import com.casic.xz.meterage.model.NoticeListModel + +class NoticeListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun getItemCount(): Int = dataRows.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_notice_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] +// holder.noticeTypeIconView.setImageResource() + holder.noticeTitleView.text = rowsBean.noticeTitle + holder.noticeDateView.text = rowsBean.noticeTime + holder.noticeContentView.text = rowsBean.noticeSketch + val state = if (rowsBean.isDel == 0) { + View.VISIBLE + } else { + View.INVISIBLE + } + holder.readStateView.visibility = state + + //绑定事件 + holder.itemView.setOnClickListener { + listener?.onItemClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var noticeTypeIconView: ImageView = view.findViewById(R.id.noticeTypeIconView) + var readStateView: View = view.findViewById(R.id.readStateView) + var noticeTitleView: TextView = view.findViewById(R.id.noticeTitleView) + var noticeDateView: TextView = view.findViewById(R.id.noticeDateView) + var noticeContentView: TextView = view.findViewById(R.id.noticeContentView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt b/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt new file mode 100644 index 0000000..016ebcb --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt @@ -0,0 +1,28 @@ +package com.casic.xz.meterage.extensions + +/** + * ArrayList扩展方法 + */ + +//将图片集合格式化成满足上传格式的数据 +fun ArrayList.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, s -> + if (index == this.size - 1) { + builder.append(s) + } else { + builder.append(s).append(",") + } + } + return builder.toString() +} + +fun addAll(vararg args: String): ArrayList { + val result = ArrayList() + args.forEach { + result.add(it) + } + return result +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 9b5faf6..b4628f3 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,8 +5,10 @@ import com.casic.xz.meterage.R import com.casic.xz.meterage.adapter.HomeGridAdapter import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo import kotlinx.android.synthetic.main.fragment_home.* class HomePageFragment : KotlinBaseFragment() { @@ -42,7 +44,9 @@ } override fun initEvent() { - + noticeLayout.setOnClickListener { + requireContext().navigatePageTo() + } } override fun initLayoutView(): Int = R.layout.fragment_home diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt index aaeb9df..7e75abe 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt @@ -4,9 +4,11 @@ import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.SaveKeyValues import kotlinx.android.synthetic.main.fragment_mine.* @@ -44,7 +46,9 @@ } override fun initEvent() { - + noticeLayout.setOnClickListener { + requireContext().navigatePageTo() + } } override fun initLayoutView(): Int = R.layout.fragment_mine diff --git a/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt new file mode 100644 index 0000000..a14ec4d --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt @@ -0,0 +1,56 @@ +package com.casic.xz.meterage.view + +import android.annotation.SuppressLint +import androidx.lifecycle.ViewModelProvider +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.vm.NoticeViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import kotlinx.android.synthetic.main.activity_notice_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +@SuppressLint("SetTextI18n") +class NoticeDetailActivity : KotlinBaseActivity() { + + private lateinit var noticeViewModel: NoticeViewModel + + override fun initData() { + leftBackView.setOnClickListener { finish() } + titleView.text = "通知公告" + + val args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + + noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + noticeViewModel.getNoticeList(args[0], args[1], args[2], "", "", 1) + noticeViewModel.noticeResult.observe(this, { + if (it.code == 200) { + val dataRow = it.data?.rows!![0] + + noticeDateView.text = dataRow.noticeTime + noticePublisherView.text = "发布人 ${dataRow.noticePublisher}" + noticeCompanyView.text = "发布单位 ${dataRow.noticeCompany}" + + noticeNoView.text = dataRow.noticeNo + noticeTitleView.text = dataRow.noticeTitle + noticeSketchView.text = dataRow.noticeSketch + } + }) + } + + override fun initEvent() { + + } + + override fun initLayoutView(): Int = R.layout.activity_notice_detail + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt index 6dde53b..3c90012 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt @@ -1,20 +1,163 @@ package com.casic.xz.meterage.view +import android.os.Handler +import android.view.View import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.adapter.NoticeListAdapter +import com.casic.xz.meterage.extensions.addAll +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.NoticeListModel import com.casic.xz.meterage.vm.NoticeViewModel +import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.activity_notice_list.* +import kotlinx.android.synthetic.main.include_empty_view.* class NoticeListActivity : KotlinBaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var noticeViewModel: NoticeViewModel + private lateinit var noticeListAdapter: NoticeListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + noticeViewModel.noticeResult.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows!! +// countBadeNumber(dataRows) + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + noticeLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows) + noticeLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023013101) + } + }) } override fun initEvent() { + leftBackView.setOnClickListener { finish() } + rightOperateView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("确定将所有未读消息标为已读?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + } + + override fun onConfirmClick() { + //TODO 设置为已读 + } + }).build().show() + } + + if (hasNoticePermission()) { + openSystemNoticeLayout.visibility = View.GONE + openSystemNoticeLayout.visibility = View.GONE + } else { + openSystemNoticeLayout.setOnClickListener { + + } + + + closeLayoutView.setOnClickListener { + openSystemNoticeLayout.visibility = View.GONE + } + } + + noticeLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getNoticeListByPage() + } + + noticeLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getNoticeListByPage() + } + } + + override fun onResume() { + super.onResume() + getNoticeListByPage() + } + + private fun getNoticeListByPage() { + noticeViewModel.getNoticeList("", "", "", "", "", pageIndex) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023013101 -> { + if (isRefresh || isLoadMore) { + noticeListAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有任何消息") { + pageIndex = 1 + getNoticeListByPage() + } + } else { + emptyView!!.hide() + noticeListAdapter = NoticeListAdapter(this, dataBeans) + noticeRecyclerView.adapter = noticeListAdapter + noticeListAdapter.setOnItemClickListener(object : + NoticeListAdapter.OnItemClickListener { + override fun onItemClicked(position: Int) { + val rowsModel = dataBeans[position] + val allArgs = addAll( + rowsModel.noticeNo, + rowsModel.noticeTitle, + rowsModel.noticePublisher, + "", + "" + ) + navigatePageTo(allArgs) + } + }) + } + } + } + } + true + } + + //TODO 判断是否开启通知权限 + private fun hasNoticePermission(): Boolean { + + return false } override fun initLayoutView(): Int = R.layout.activity_notice_list @@ -24,6 +167,7 @@ } override fun setupTopBarLayout() { - + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) } } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_blue_radius_5.xml b/app/src/main/res/drawable/bg_solid_layout_blue_radius_5.xml new file mode 100644 index 0000000..7b86026 --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_blue_radius_5.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_error.xml b/app/src/main/res/drawable/ic_error.xml new file mode 100644 index 0000000..3ee0260 --- /dev/null +++ b/app/src/main/res/drawable/ic_error.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_notice.xml b/app/src/main/res/drawable/ic_notice.xml new file mode 100644 index 0000000..962e03f --- /dev/null +++ b/app/src/main/res/drawable/ic_notice.xml @@ -0,0 +1,13 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_qr_code.xml b/app/src/main/res/drawable/ic_qr_code.xml index 43c8c42..3fc5935 100644 --- a/app/src/main/res/drawable/ic_qr_code.xml +++ b/app/src/main/res/drawable/ic_qr_code.xml @@ -5,8 +5,8 @@ android:viewportHeight="1024"> + android:pathData="M733.37,673.68H285.51a88.58,88.58 0,0 1,-88.58 -88.52v-149.56a88.58,88.58 0,0 1,88.58 -88.52h447.86a88.58,88.58 0,0 1,88.58 88.52v149.56a88.58,88.58 0,0 1,-88.58 88.52z" /> + android:pathData="M115.9,410.39A39.1,39.1 0,0 1,76.8 371.3L76.8,248.87A172.27,172.27 0,0 1,248.87 76.8L366.08,76.8a39.1,39.1 0,1 1,0 78.19L248.87,154.99a93.99,93.99 0,0 0,-93.89 93.89L154.99,371.3a39.1,39.1 0,0 1,-39.09 39.09zM371.31,942.08L248.87,942.08A172.27,172.27 0,0 1,76.8 770.01v-114.61a39.1,39.1 0,1 1,78.19 0v114.61a93.99,93.99 0,0 0,93.89 93.89h122.43a39.1,39.1 0,1 1,0 78.19zM770.01,942.08L652.8,942.08a39.1,39.1 0,1 1,0 -78.19h117.22a93.99,93.99 0,0 0,93.89 -93.89v-119.81a39.1,39.1 0,0 1,78.19 0v119.83A172.26,172.26 0,0 1,770.01 942.08zM902.99,410.39a39.1,39.1 0,0 1,-39.1 -39.09L863.89,248.87a93.99,93.99 0,0 0,-93.89 -93.89h-125.04a39.1,39.1 0,1 1,0 -78.19h125.04A172.27,172.27 0,0 1,942.08 248.87L942.08,371.3a39.1,39.1 0,0 1,-39.09 39.09zM717.94,551.14L300.94,551.14a39.1,39.1 0,0 1,0 -78.19h417a39.1,39.1 0,1 1,0 78.19z" /> diff --git a/app/src/main/res/drawable/ic_read_notice.xml b/app/src/main/res/drawable/ic_read_notice.xml new file mode 100644 index 0000000..fef5b72 --- /dev/null +++ b/app/src/main/res/drawable/ic_read_notice.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_right_black.xml b/app/src/main/res/drawable/ic_right_black.xml new file mode 100644 index 0000000..a25faa7 --- /dev/null +++ b/app/src/main/res/drawable/ic_right_black.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_notice_detail.xml b/app/src/main/res/layout/activity_notice_detail.xml new file mode 100644 index 0000000..25b055f --- /dev/null +++ b/app/src/main/res/layout/activity_notice_detail.xml @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_notice_list.xml b/app/src/main/res/layout/activity_notice_list.xml index 41d2ef1..8e224c0 100644 --- a/app/src/main/res/layout/activity_notice_list.xml +++ b/app/src/main/res/layout/activity_notice_list.xml @@ -1,6 +1,106 @@ + android:layout_height="match_parent" + android:background="@color/mainBackground" + android:orientation="vertical"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 8d76acb..41b32a9 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -44,6 +44,7 @@ diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml index 4b89b9d..0643064 100644 --- a/app/src/main/res/layout/fragment_mine.xml +++ b/app/src/main/res/layout/fragment_mine.xml @@ -49,9 +49,10 @@ android:textSize="@dimen/sp_22" /> + android:layout_height="wrap_content" + android:layout_alignParentEnd="true"> + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/include_empty_view.xml b/app/src/main/res/layout/include_empty_view.xml new file mode 100644 index 0000000..37de024 --- /dev/null +++ b/app/src/main/res/layout/include_empty_view.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_notice_rv_l.xml b/app/src/main/res/layout/item_notice_rv_l.xml new file mode 100644 index 0000000..40710f8 --- /dev/null +++ b/app/src/main/res/layout/item_notice_rv_l.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 97c55c3..0d85b90 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,6 +37,7 @@ + \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt b/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt new file mode 100644 index 0000000..722e4d1 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/adapter/NoticeListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.xz.meterage.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.xz.meterage.R +import com.casic.xz.meterage.model.NoticeListModel + +class NoticeListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun getItemCount(): Int = dataRows.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_notice_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] +// holder.noticeTypeIconView.setImageResource() + holder.noticeTitleView.text = rowsBean.noticeTitle + holder.noticeDateView.text = rowsBean.noticeTime + holder.noticeContentView.text = rowsBean.noticeSketch + val state = if (rowsBean.isDel == 0) { + View.VISIBLE + } else { + View.INVISIBLE + } + holder.readStateView.visibility = state + + //绑定事件 + holder.itemView.setOnClickListener { + listener?.onItemClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var noticeTypeIconView: ImageView = view.findViewById(R.id.noticeTypeIconView) + var readStateView: View = view.findViewById(R.id.readStateView) + var noticeTitleView: TextView = view.findViewById(R.id.noticeTitleView) + var noticeDateView: TextView = view.findViewById(R.id.noticeDateView) + var noticeContentView: TextView = view.findViewById(R.id.noticeContentView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt b/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt new file mode 100644 index 0000000..016ebcb --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/extensions/ArrayList.kt @@ -0,0 +1,28 @@ +package com.casic.xz.meterage.extensions + +/** + * ArrayList扩展方法 + */ + +//将图片集合格式化成满足上传格式的数据 +fun ArrayList.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, s -> + if (index == this.size - 1) { + builder.append(s) + } else { + builder.append(s).append(",") + } + } + return builder.toString() +} + +fun addAll(vararg args: String): ArrayList { + val result = ArrayList() + args.forEach { + result.add(it) + } + return result +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 9b5faf6..b4628f3 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,8 +5,10 @@ import com.casic.xz.meterage.R import com.casic.xz.meterage.adapter.HomeGridAdapter import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo import kotlinx.android.synthetic.main.fragment_home.* class HomePageFragment : KotlinBaseFragment() { @@ -42,7 +44,9 @@ } override fun initEvent() { - + noticeLayout.setOnClickListener { + requireContext().navigatePageTo() + } } override fun initLayoutView(): Int = R.layout.fragment_home diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt index aaeb9df..7e75abe 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/MinePageFragment.kt @@ -4,9 +4,11 @@ import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.NoticeListActivity import com.casic.xz.meterage.vm.NoticeViewModel import com.casic.xz.meterage.vm.UserViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.SaveKeyValues import kotlinx.android.synthetic.main.fragment_mine.* @@ -44,7 +46,9 @@ } override fun initEvent() { - + noticeLayout.setOnClickListener { + requireContext().navigatePageTo() + } } override fun initLayoutView(): Int = R.layout.fragment_mine diff --git a/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt new file mode 100644 index 0000000..a14ec4d --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/NoticeDetailActivity.kt @@ -0,0 +1,56 @@ +package com.casic.xz.meterage.view + +import android.annotation.SuppressLint +import androidx.lifecycle.ViewModelProvider +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.vm.NoticeViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import kotlinx.android.synthetic.main.activity_notice_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +@SuppressLint("SetTextI18n") +class NoticeDetailActivity : KotlinBaseActivity() { + + private lateinit var noticeViewModel: NoticeViewModel + + override fun initData() { + leftBackView.setOnClickListener { finish() } + titleView.text = "通知公告" + + val args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + + noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + noticeViewModel.getNoticeList(args[0], args[1], args[2], "", "", 1) + noticeViewModel.noticeResult.observe(this, { + if (it.code == 200) { + val dataRow = it.data?.rows!![0] + + noticeDateView.text = dataRow.noticeTime + noticePublisherView.text = "发布人 ${dataRow.noticePublisher}" + noticeCompanyView.text = "发布单位 ${dataRow.noticeCompany}" + + noticeNoView.text = dataRow.noticeNo + noticeTitleView.text = dataRow.noticeTitle + noticeSketchView.text = dataRow.noticeSketch + } + }) + } + + override fun initEvent() { + + } + + override fun initLayoutView(): Int = R.layout.activity_notice_detail + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt index 6dde53b..3c90012 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/NoticeListActivity.kt @@ -1,20 +1,163 @@ package com.casic.xz.meterage.view +import android.os.Handler +import android.view.View import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.R +import com.casic.xz.meterage.adapter.NoticeListAdapter +import com.casic.xz.meterage.extensions.addAll +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.NoticeListModel import com.casic.xz.meterage.vm.NoticeViewModel +import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.activity_notice_list.* +import kotlinx.android.synthetic.main.include_empty_view.* class NoticeListActivity : KotlinBaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var noticeViewModel: NoticeViewModel + private lateinit var noticeListAdapter: NoticeListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + noticeViewModel.noticeResult.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows!! +// countBadeNumber(dataRows) + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + noticeLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows) + noticeLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023013101) + } + }) } override fun initEvent() { + leftBackView.setOnClickListener { finish() } + rightOperateView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("确定将所有未读消息标为已读?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + } + + override fun onConfirmClick() { + //TODO 设置为已读 + } + }).build().show() + } + + if (hasNoticePermission()) { + openSystemNoticeLayout.visibility = View.GONE + openSystemNoticeLayout.visibility = View.GONE + } else { + openSystemNoticeLayout.setOnClickListener { + + } + + + closeLayoutView.setOnClickListener { + openSystemNoticeLayout.visibility = View.GONE + } + } + + noticeLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getNoticeListByPage() + } + + noticeLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getNoticeListByPage() + } + } + + override fun onResume() { + super.onResume() + getNoticeListByPage() + } + + private fun getNoticeListByPage() { + noticeViewModel.getNoticeList("", "", "", "", "", pageIndex) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023013101 -> { + if (isRefresh || isLoadMore) { + noticeListAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有任何消息") { + pageIndex = 1 + getNoticeListByPage() + } + } else { + emptyView!!.hide() + noticeListAdapter = NoticeListAdapter(this, dataBeans) + noticeRecyclerView.adapter = noticeListAdapter + noticeListAdapter.setOnItemClickListener(object : + NoticeListAdapter.OnItemClickListener { + override fun onItemClicked(position: Int) { + val rowsModel = dataBeans[position] + val allArgs = addAll( + rowsModel.noticeNo, + rowsModel.noticeTitle, + rowsModel.noticePublisher, + "", + "" + ) + navigatePageTo(allArgs) + } + }) + } + } + } + } + true + } + + //TODO 判断是否开启通知权限 + private fun hasNoticePermission(): Boolean { + + return false } override fun initLayoutView(): Int = R.layout.activity_notice_list @@ -24,6 +167,7 @@ } override fun setupTopBarLayout() { - + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) } } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_blue_radius_5.xml b/app/src/main/res/drawable/bg_solid_layout_blue_radius_5.xml new file mode 100644 index 0000000..7b86026 --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_blue_radius_5.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_error.xml b/app/src/main/res/drawable/ic_error.xml new file mode 100644 index 0000000..3ee0260 --- /dev/null +++ b/app/src/main/res/drawable/ic_error.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_notice.xml b/app/src/main/res/drawable/ic_notice.xml new file mode 100644 index 0000000..962e03f --- /dev/null +++ b/app/src/main/res/drawable/ic_notice.xml @@ -0,0 +1,13 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_qr_code.xml b/app/src/main/res/drawable/ic_qr_code.xml index 43c8c42..3fc5935 100644 --- a/app/src/main/res/drawable/ic_qr_code.xml +++ b/app/src/main/res/drawable/ic_qr_code.xml @@ -5,8 +5,8 @@ android:viewportHeight="1024"> + android:pathData="M733.37,673.68H285.51a88.58,88.58 0,0 1,-88.58 -88.52v-149.56a88.58,88.58 0,0 1,88.58 -88.52h447.86a88.58,88.58 0,0 1,88.58 88.52v149.56a88.58,88.58 0,0 1,-88.58 88.52z" /> + android:pathData="M115.9,410.39A39.1,39.1 0,0 1,76.8 371.3L76.8,248.87A172.27,172.27 0,0 1,248.87 76.8L366.08,76.8a39.1,39.1 0,1 1,0 78.19L248.87,154.99a93.99,93.99 0,0 0,-93.89 93.89L154.99,371.3a39.1,39.1 0,0 1,-39.09 39.09zM371.31,942.08L248.87,942.08A172.27,172.27 0,0 1,76.8 770.01v-114.61a39.1,39.1 0,1 1,78.19 0v114.61a93.99,93.99 0,0 0,93.89 93.89h122.43a39.1,39.1 0,1 1,0 78.19zM770.01,942.08L652.8,942.08a39.1,39.1 0,1 1,0 -78.19h117.22a93.99,93.99 0,0 0,93.89 -93.89v-119.81a39.1,39.1 0,0 1,78.19 0v119.83A172.26,172.26 0,0 1,770.01 942.08zM902.99,410.39a39.1,39.1 0,0 1,-39.1 -39.09L863.89,248.87a93.99,93.99 0,0 0,-93.89 -93.89h-125.04a39.1,39.1 0,1 1,0 -78.19h125.04A172.27,172.27 0,0 1,942.08 248.87L942.08,371.3a39.1,39.1 0,0 1,-39.09 39.09zM717.94,551.14L300.94,551.14a39.1,39.1 0,0 1,0 -78.19h417a39.1,39.1 0,1 1,0 78.19z" /> diff --git a/app/src/main/res/drawable/ic_read_notice.xml b/app/src/main/res/drawable/ic_read_notice.xml new file mode 100644 index 0000000..fef5b72 --- /dev/null +++ b/app/src/main/res/drawable/ic_read_notice.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_right_black.xml b/app/src/main/res/drawable/ic_right_black.xml new file mode 100644 index 0000000..a25faa7 --- /dev/null +++ b/app/src/main/res/drawable/ic_right_black.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_notice_detail.xml b/app/src/main/res/layout/activity_notice_detail.xml new file mode 100644 index 0000000..25b055f --- /dev/null +++ b/app/src/main/res/layout/activity_notice_detail.xml @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_notice_list.xml b/app/src/main/res/layout/activity_notice_list.xml index 41d2ef1..8e224c0 100644 --- a/app/src/main/res/layout/activity_notice_list.xml +++ b/app/src/main/res/layout/activity_notice_list.xml @@ -1,6 +1,106 @@ + android:layout_height="match_parent" + android:background="@color/mainBackground" + android:orientation="vertical"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 8d76acb..41b32a9 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -44,6 +44,7 @@ diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml index 4b89b9d..0643064 100644 --- a/app/src/main/res/layout/fragment_mine.xml +++ b/app/src/main/res/layout/fragment_mine.xml @@ -49,9 +49,10 @@ android:textSize="@dimen/sp_22" /> + android:layout_height="wrap_content" + android:layout_alignParentEnd="true"> + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/include_empty_view.xml b/app/src/main/res/layout/include_empty_view.xml new file mode 100644 index 0000000..37de024 --- /dev/null +++ b/app/src/main/res/layout/include_empty_view.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_notice_rv_l.xml b/app/src/main/res/layout/item_notice_rv_l.xml new file mode 100644 index 0000000..40710f8 --- /dev/null +++ b/app/src/main/res/layout/item_notice_rv_l.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 921964f..a811954 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -47,7 +47,4 @@ 255dp - - 16dp - 16dp \ No newline at end of file