From c940c4b23657c11dbbf84dba006f2a1b570f5843 Mon Sep 17 00:00:00 2001 From: qiji4215 Date: Mon, 24 Apr 2023 10:50:17 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=88=91=E7=9A=84=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=88=97=E8=A1=A8=E9=83=A8=E5=88=86=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../omqs/ui/activity/map/MainActivity.kt | 2 - .../personalcenter/PersonalCenterFragment.kt | 3 + .../qsrecordlist/QsRecordListAdapter.kt | 60 +++++++++++++++++++ .../qsrecordlist/QsRecordListFragment.kt | 52 ++++++++++++++++ .../qsrecordlist/QsRecordListViewModel.kt | 30 ++++++++++ .../ui/fragment/tasklist/TaskListAdapter.kt | 20 +++---- .../res/layout/adapter_qs_record_list.xml | 22 +++++++ .../res/layout/fragment_qs_record_list.xml | 27 +++++++++ .../main/res/menu/personal_center_menu.xml | 4 +- .../res/navigation/left_drawer_nav_graph.xml | 8 +++ 10 files changed, 214 insertions(+), 14 deletions(-) create mode 100644 app/src/main/java/com/navinfo/omqs/ui/fragment/qsrecordlist/QsRecordListAdapter.kt create mode 100644 app/src/main/java/com/navinfo/omqs/ui/fragment/qsrecordlist/QsRecordListFragment.kt create mode 100644 app/src/main/java/com/navinfo/omqs/ui/fragment/qsrecordlist/QsRecordListViewModel.kt create mode 100644 app/src/main/res/layout/adapter_qs_record_list.xml create mode 100644 app/src/main/res/layout/fragment_qs_record_list.xml diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt index 51f81e6c..47442314 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt @@ -74,8 +74,6 @@ class MainActivity : BaseActivity() { ToastUtils.showLong("定位${it.longitude}") binding!!.viewModel!!.addSaveTrace(it) binding!!.viewModel!!.startSaveTraceThread(this) - viewModel.addSaveTrace(it) -// binding.viewModel!!.startSaveTraceThread(this) }) //显示轨迹图层 // mapController.layerManagerHandler.showNiLocationLayer(Constant.DATA_PATH+ SystemConstant.USER_ID+"/trace.sqlite") diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt index 77e85f60..0d3fd4da 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt @@ -129,6 +129,9 @@ class PersonalCenterFragment : BaseFragment(), FSAFActivityCallbacks { R.id.personal_center_menu_task_list -> { findNavController().navigate(R.id.TaskListFragment) } + R.id.personal_center_menu_qs_record_list -> { + findNavController().navigate(R.id.QsRecordListFragment) + } } true } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/qsrecordlist/QsRecordListAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/qsrecordlist/QsRecordListAdapter.kt new file mode 100644 index 00000000..cc55ecf2 --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/qsrecordlist/QsRecordListAdapter.kt @@ -0,0 +1,60 @@ +package com.navinfo.omqs.ui.fragment.tasklist + +import android.content.Context +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.lifecycle.Observer +import com.navinfo.collect.library.data.entity.QsRecordBean +import com.navinfo.omqs.R +import com.navinfo.omqs.bean.TaskBean +import com.navinfo.omqs.databinding.AdapterQsRecordListBinding +import com.navinfo.omqs.databinding.AdapterTaskListBinding +import com.navinfo.omqs.http.taskdownload.TaskDownloadManager +import com.navinfo.omqs.tools.FileManager.Companion.FileDownloadStatus +import com.navinfo.omqs.ui.other.BaseRecyclerViewAdapter +import com.navinfo.omqs.ui.other.BaseViewHolder + +/** + * 离线地图城市列表 RecyclerView 适配器 + * + * 在 RecycleView 的 ViewHolder 中监听 ViewModel 的 LiveData,然后此时传递的 lifecycleOwner 是对应的 Fragment。由于 ViewHolder 的生命周期是比 Fragment 短的,所以当 ViewHolder 销毁时,由于 Fragment 的 Lifecycle 还没有结束,此时 ViewHolder 会发生内存泄露(监听的 LiveData 没有解绑) + * 这种场景下有两种解决办法: + *使用 LiveData 的 observeForever 然后在 ViewHolder 销毁前手动调用 removeObserver + *使用 LifecycleRegistry 给 ViewHolder 分发生命周期(这里使用了这个) + */ +class QsRecordListAdapter( + private val context: Context +) : BaseRecyclerViewAdapter() { + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder { + val viewBinding = + AdapterQsRecordListBinding.inflate(LayoutInflater.from(parent.context), parent, false) + return BaseViewHolder(viewBinding) + } + + override fun onViewRecycled(holder: BaseViewHolder) { + super.onViewRecycled(holder) + //页面滑动时会用holder重构页面,但是对进度条的监听回调会一直返回,扰乱UI,所以当当前holder去重构的时候,移除监听 + } + + override fun onBindViewHolder(holder: BaseViewHolder, position: Int) { + val binding: AdapterQsRecordListBinding = + holder.viewBinding as AdapterQsRecordListBinding + val qsRecordBean = data[position] + //tag 方便onclick里拿到数据 + holder.tag = qsRecordBean.id.toString() + changeViews(binding, qsRecordBean) + } + + private fun changeViews(binding: AdapterQsRecordListBinding, qsRecordBean: QsRecordBean) { + } + + override fun getItemViewRes(position: Int): Int { + return R.layout.adapter_offline_map_city + } +} + + diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/qsrecordlist/QsRecordListFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/qsrecordlist/QsRecordListFragment.kt new file mode 100644 index 00000000..cf8ca525 --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/qsrecordlist/QsRecordListFragment.kt @@ -0,0 +1,52 @@ +package com.navinfo.omqs.ui.fragment.qsrecordlist + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.viewModels +import androidx.recyclerview.widget.LinearLayoutManager +import com.navinfo.omqs.databinding.FragmentQsRecordListBinding +import com.navinfo.omqs.ui.fragment.BaseFragment +import com.navinfo.omqs.ui.fragment.tasklist.QsRecordListAdapter +import dagger.hilt.android.AndroidEntryPoint +import javax.inject.Inject + +@AndroidEntryPoint +class QsRecordListFragment : BaseFragment(){ + private var _binding: FragmentQsRecordListBinding? = null + private val viewModel by viewModels() + private val binding get() = _binding!! + private val adapter: QsRecordListAdapter by lazy { + QsRecordListAdapter( + requireContext() + ) + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + _binding = FragmentQsRecordListBinding.inflate(inflater, container, false) + return binding.root + + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + val layoutManager = LinearLayoutManager(context) + //// 设置 RecyclerView 的固定大小,避免在滚动时重新计算视图大小和布局,提高性能 + binding.qsRecyclerview.setHasFixedSize(true) + binding.qsRecyclerview.layoutManager = layoutManager + binding.qsRecyclerview.adapter = adapter + viewModel.liveDataQSList.observe(viewLifecycleOwner) { + adapter.refreshData(it) + } + viewModel.getList(requireContext()) + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/qsrecordlist/QsRecordListViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/qsrecordlist/QsRecordListViewModel.kt new file mode 100644 index 00000000..721f4c50 --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/qsrecordlist/QsRecordListViewModel.kt @@ -0,0 +1,30 @@ +package com.navinfo.omqs.ui.fragment.qsrecordlist + +import android.content.Context +import android.util.Log +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.navinfo.collect.library.data.entity.QsRecordBean +import dagger.hilt.android.lifecycle.HiltViewModel +import io.realm.Realm +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class QsRecordListViewModel @Inject constructor( +) : ViewModel() { + + val liveDataQSList = MutableLiveData>() + + fun getList(context: Context) { + viewModelScope.launch(Dispatchers.IO) { + val realm = Realm.getDefaultInstance() + Log.e("jingo","realm hashCOde ${realm.hashCode()}") + val objects = realm.where(QsRecordBean::class.java).findAll() + liveDataQSList.postValue(realm.copyFromRealm(objects)) + } + } + +} diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt index 8c03439a..67103b43 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt @@ -10,7 +10,7 @@ import com.navinfo.omqs.R import com.navinfo.omqs.bean.TaskBean import com.navinfo.omqs.databinding.AdapterTaskListBinding import com.navinfo.omqs.http.taskdownload.TaskDownloadManager -import com.navinfo.omqs.tools.FileManager.Companion.FileDownloadStatus +import com.navinfo.omqs.tools.FileManager import com.navinfo.omqs.ui.other.BaseRecyclerViewAdapter import com.navinfo.omqs.ui.other.BaseViewHolder @@ -31,11 +31,11 @@ class TaskListAdapter( if (it.tag != null) { val taskBean = data[it.tag as Int] when (taskBean.status) { - FileDownloadStatus.NONE, FileDownloadStatus.UPDATE, FileDownloadStatus.PAUSE, FileDownloadStatus.ERROR -> { + FileManager.Companion.FileDownloadStatus.NONE, FileManager.Companion.FileDownloadStatus.UPDATE, FileManager.Companion.FileDownloadStatus.PAUSE, FileManager.Companion.FileDownloadStatus.ERROR -> { Log.e("jingo", "开始下载 ${taskBean.status}") downloadManager.start(taskBean.id) } - FileDownloadStatus.LOADING, FileDownloadStatus.WAITING -> { + FileManager.Companion.FileDownloadStatus.LOADING, FileManager.Companion.FileDownloadStatus.WAITING -> { Log.e("jingo", "暂停 ${taskBean.status}") downloadManager.pause(taskBean.id) } @@ -86,37 +86,37 @@ class TaskListAdapter( binding.taskProgress.progress = (cityBean.currentSize * 100 / cityBean.fileSize).toInt() when (cityBean.status) { - FileDownloadStatus.NONE -> { + FileManager.Companion.FileDownloadStatus.NONE -> { if (binding.taskProgress.visibility == View.VISIBLE) binding.taskProgress.visibility = View.INVISIBLE binding.taskDownloadBtn.text = "下载" } - FileDownloadStatus.WAITING -> { + FileManager.Companion.FileDownloadStatus.WAITING -> { if (binding.taskProgress.visibility != View.VISIBLE) binding.taskProgress.visibility = View.VISIBLE binding.taskDownloadBtn.text = "等待中" } - FileDownloadStatus.LOADING -> { + FileManager.Companion.FileDownloadStatus.LOADING -> { if (binding.taskProgress.visibility != View.VISIBLE) binding.taskProgress.visibility = View.VISIBLE binding.taskDownloadBtn.text = "暂停" } - FileDownloadStatus.PAUSE -> { + FileManager.Companion.FileDownloadStatus.PAUSE -> { if (binding.taskProgress.visibility != View.VISIBLE) binding.taskProgress.visibility = View.VISIBLE binding.taskDownloadBtn.text = "继续" } - FileDownloadStatus.ERROR -> { + FileManager.Companion.FileDownloadStatus.ERROR -> { if (binding.taskProgress.visibility != View.VISIBLE) binding.taskProgress.visibility = View.VISIBLE binding.taskDownloadBtn.text = "重试" } - FileDownloadStatus.DONE -> { + FileManager.Companion.FileDownloadStatus.DONE -> { if (binding.taskProgress.visibility == View.VISIBLE) binding.taskProgress.visibility = View.INVISIBLE binding.taskDownloadBtn.text = "已完成" } - FileDownloadStatus.UPDATE -> { + FileManager.Companion.FileDownloadStatus.UPDATE -> { if (binding.taskProgress.visibility == View.VISIBLE) binding.taskProgress.visibility = View.INVISIBLE binding.taskDownloadBtn.text = "更新" diff --git a/app/src/main/res/layout/adapter_qs_record_list.xml b/app/src/main/res/layout/adapter_qs_record_list.xml new file mode 100644 index 00000000..d56367b6 --- /dev/null +++ b/app/src/main/res/layout/adapter_qs_record_list.xml @@ -0,0 +1,22 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_qs_record_list.xml b/app/src/main/res/layout/fragment_qs_record_list.xml new file mode 100644 index 00000000..22e1700a --- /dev/null +++ b/app/src/main/res/layout/fragment_qs_record_list.xml @@ -0,0 +1,27 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/personal_center_menu.xml b/app/src/main/res/menu/personal_center_menu.xml index c86cf5a5..86f38968 100644 --- a/app/src/main/res/menu/personal_center_menu.xml +++ b/app/src/main/res/menu/personal_center_menu.xml @@ -37,9 +37,9 @@ android:icon="@drawable/baseline_person_24" android:title="任务列表" /> + android:title="我的数据" /> + + + + \ No newline at end of file