diff --git a/.idea/misc.xml b/.idea/misc.xml index 983a016..4d86ddb 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,7 +1,7 @@ - + diff --git a/app/build.gradle b/app/build.gradle index b55efaa..f317370 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,11 +6,11 @@ apply plugin: 'kotlin-android' apply plugin: 'kotlin-kapt' //apply plugin: 'realm-android' android { - namespace 'com.navinfo.vivo' + namespace 'com.navinfo.volvo' compileSdk 32 defaultConfig { - applicationId "com.navinfo.vivo" + applicationId "com.navinfo.volvo" minSdk 24 targetSdk 32 versionCode 1 @@ -74,4 +74,6 @@ dependencies { // implementation "android.arch.lifecycle:extensions:1.1.1" // annotationProcessor "android.arch.lifecycle:compiler:1.1.1" implementation 'com.tencent.wcdb:wcdb-android:1.1-19' + implementation 'com.google.code.gson:gson:2.10' + implementation 'com.yanzhenjie.recyclerview:x:1.3.2' } \ No newline at end of file diff --git a/app/src/androidTest/java/com/navinfo/vivo/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/navinfo/volvo/ExampleInstrumentedTest.kt similarity index 86% rename from app/src/androidTest/java/com/navinfo/vivo/ExampleInstrumentedTest.kt rename to app/src/androidTest/java/com/navinfo/volvo/ExampleInstrumentedTest.kt index f16bf01..5d650bd 100644 --- a/app/src/androidTest/java/com/navinfo/vivo/ExampleInstrumentedTest.kt +++ b/app/src/androidTest/java/com/navinfo/volvo/ExampleInstrumentedTest.kt @@ -1,4 +1,4 @@ -package com.navinfo.vivo +package com.navinfo.volvo import androidx.test.platform.app.InstrumentationRegistry import androidx.test.ext.junit.runners.AndroidJUnit4 @@ -19,6 +19,6 @@ class ExampleInstrumentedTest { fun useAppContext() { // Context of the app under test. val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.navinfo.vivo", appContext.packageName) + assertEquals("com.navinfo.volvo", appContext.packageName) } } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3ee1abf..59ecdb6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -4,16 +4,17 @@ diff --git a/app/src/main/java/com/navinfo/vivo/db/dao/entity/Attachment.kt b/app/src/main/java/com/navinfo/vivo/db/dao/entity/Attachment.kt deleted file mode 100644 index 862769b..0000000 --- a/app/src/main/java/com/navinfo/vivo/db/dao/entity/Attachment.kt +++ /dev/null @@ -1,4 +0,0 @@ -package com.navinfo.vivo.db.dao.entity - -class Attachment { -} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/vivo/db/dao/entity/Message.kt b/app/src/main/java/com/navinfo/vivo/db/dao/entity/Message.kt deleted file mode 100644 index d356ad3..0000000 --- a/app/src/main/java/com/navinfo/vivo/db/dao/entity/Message.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.navinfo.vivo.db.dao.entity - -import androidx.room.Entity -import androidx.room.PrimaryKey - -@Entity(tableName = "message") -class Message( - @PrimaryKey(autoGenerate = true) - var id: Long = 0, - /** - *标题 - */ - var title: String, - /** - * 信息内容 - */ - var message: String, - /** - * 操作时间 - */ - var optionDate: String, - /** - * 发送时间 - */ - var sendDate: String, - /** - * 信息状态 - */ - var status: Int, - /** - * 发送者ID - */ - var fromId: String, - /** - * 接收者ID - */ - var toId: String, - /** - * 附件列表 - */ - var attachment: MutableList -) { - -} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/vivo/ui/home/HomeFragment.kt b/app/src/main/java/com/navinfo/vivo/ui/home/HomeFragment.kt deleted file mode 100644 index 51b0759..0000000 --- a/app/src/main/java/com/navinfo/vivo/ui/home/HomeFragment.kt +++ /dev/null @@ -1,42 +0,0 @@ -package com.navinfo.vivo.ui.home - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.fragment.app.Fragment -import androidx.lifecycle.ViewModelProvider -import com.navinfo.vivo.databinding.FragmentHomeBinding - -class HomeFragment : Fragment() { - - private var _binding: FragmentHomeBinding? = null - - // This property is only valid between onCreateView and - // onDestroyView. - private val binding get() = _binding!! - - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - val homeViewModel = - ViewModelProvider(this).get(HomeViewModel::class.java) - - _binding = FragmentHomeBinding.inflate(inflater, container, false) - val root: View = binding.root - - val textView: TextView = binding.textHome - homeViewModel.text.observe(viewLifecycleOwner) { - textView.text = it - } - return root - } - - override fun onDestroyView() { - super.onDestroyView() - _binding = null - } -} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/vivo/ui/home/HomeViewModel.kt b/app/src/main/java/com/navinfo/vivo/ui/home/HomeViewModel.kt deleted file mode 100644 index 3e57040..0000000 --- a/app/src/main/java/com/navinfo/vivo/ui/home/HomeViewModel.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.navinfo.vivo.ui.home - -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel - -class HomeViewModel : ViewModel() { - - private val _text = MutableLiveData().apply { - value = "This is home Fragment" - } - val text: LiveData = _text -} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/vivo/MainActivity.kt b/app/src/main/java/com/navinfo/volvo/MainActivity.kt similarity index 91% rename from app/src/main/java/com/navinfo/vivo/MainActivity.kt rename to app/src/main/java/com/navinfo/volvo/MainActivity.kt index d947a69..1f0713a 100644 --- a/app/src/main/java/com/navinfo/vivo/MainActivity.kt +++ b/app/src/main/java/com/navinfo/volvo/MainActivity.kt @@ -1,4 +1,4 @@ -package com.navinfo.vivo +package com.navinfo.volvo import android.os.Bundle import com.google.android.material.bottomnavigation.BottomNavigationView @@ -7,7 +7,8 @@ import androidx.navigation.findNavController import androidx.navigation.ui.AppBarConfiguration import androidx.navigation.ui.setupActionBarWithNavController import androidx.navigation.ui.setupWithNavController -import com.navinfo.vivo.databinding.ActivityMainBinding +import com.navinfo.volvo.R +import com.navinfo.volvo.databinding.ActivityMainBinding class MainActivity : AppCompatActivity() { diff --git a/app/src/main/java/com/navinfo/vivo/db/dao/MapLifeDataBase.java b/app/src/main/java/com/navinfo/volvo/db/dao/MapLifeDataBase.java similarity index 96% rename from app/src/main/java/com/navinfo/vivo/db/dao/MapLifeDataBase.java rename to app/src/main/java/com/navinfo/volvo/db/dao/MapLifeDataBase.java index 64698d8..a0bbcc6 100644 --- a/app/src/main/java/com/navinfo/vivo/db/dao/MapLifeDataBase.java +++ b/app/src/main/java/com/navinfo/volvo/db/dao/MapLifeDataBase.java @@ -1,4 +1,4 @@ -package com.navinfo.vivo.db.dao; +package com.navinfo.volvo.db.dao; import android.content.Context; @@ -10,7 +10,9 @@ import androidx.room.RoomDatabase; import androidx.sqlite.db.SupportSQLiteDatabase; import androidx.sqlite.db.SupportSQLiteOpenHelper; -import com.navinfo.vivo.db.dao.entity.Message; +import com.navinfo.volvo.db.dao.entity.Attachment; +import com.navinfo.volvo.db.dao.entity.Message; +import com.navinfo.volvo.db.dao.entity.User; import com.tencent.wcdb.database.SQLiteCipherSpec; import com.tencent.wcdb.database.SQLiteDatabase; @@ -23,7 +25,7 @@ import com.tencent.wcdb.repair.BackupKit; import com.tencent.wcdb.repair.RecoverKit; import com.tencent.wcdb.room.db.WCDBDatabase; -@Database(entities = {Message.class}, version = 1, exportSchema = false) +@Database(entities = {Message.class, Attachment.class, User.class}, version = 1, exportSchema = false) public abstract class MapLifeDataBase extends RoomDatabase { // marking the instance as volatile to ensure atomic access to the variable /** diff --git a/app/src/main/java/com/navinfo/vivo/db/dao/MessageDao.kt b/app/src/main/java/com/navinfo/volvo/db/dao/MessageDao.kt similarity index 83% rename from app/src/main/java/com/navinfo/vivo/db/dao/MessageDao.kt rename to app/src/main/java/com/navinfo/volvo/db/dao/MessageDao.kt index 80f5cee..c4618a2 100644 --- a/app/src/main/java/com/navinfo/vivo/db/dao/MessageDao.kt +++ b/app/src/main/java/com/navinfo/volvo/db/dao/MessageDao.kt @@ -1,10 +1,10 @@ -package com.navinfo.vivo.db.dao +package com.navinfo.volvo.db.dao import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query -import com.navinfo.vivo.db.dao.entity.Message +import com.navinfo.volvo.db.dao.entity.Message @Dao interface MessageDao { diff --git a/app/src/main/java/com/navinfo/volvo/db/dao/entity/Attachment.kt b/app/src/main/java/com/navinfo/volvo/db/dao/entity/Attachment.kt new file mode 100644 index 0000000..9d981e8 --- /dev/null +++ b/app/src/main/java/com/navinfo/volvo/db/dao/entity/Attachment.kt @@ -0,0 +1,41 @@ +package com.navinfo.volvo.db.dao.entity + +import androidx.room.Entity +import androidx.room.PrimaryKey +import androidx.room.TypeConverter +import com.google.gson.reflect.TypeToken +import com.navinfo.volvo.tools.GsonUtil + +@Entity(tableName = "Attachment") +data class Attachment( + @PrimaryKey() + var id: String +) + +class AttachmentConverters() { + @TypeConverter + fun stringToAttachment(value: String): Attachment { + val type = object : TypeToken() { + + }.type + return GsonUtil.getInstance().fromJson(value, type) + } + + @TypeConverter + fun attachmentToString(attachment: Attachment): String { + return GsonUtil.getInstance().toJson(attachment) + } + + @TypeConverter + fun listToString(list: MutableList): String { + return GsonUtil.getInstance().toJson(list) + } + + @TypeConverter + fun stringToList(value: String): MutableList { + val type = object : TypeToken>() { + + }.type + return GsonUtil.getInstance().fromJson(value, type) + } +} diff --git a/app/src/main/java/com/navinfo/volvo/db/dao/entity/Message.kt b/app/src/main/java/com/navinfo/volvo/db/dao/entity/Message.kt new file mode 100644 index 0000000..81048d6 --- /dev/null +++ b/app/src/main/java/com/navinfo/volvo/db/dao/entity/Message.kt @@ -0,0 +1,46 @@ +package com.navinfo.volvo.db.dao.entity + +import androidx.room.Entity +import androidx.room.PrimaryKey +import androidx.room.TypeConverters + +@Entity(tableName = "message") +@TypeConverters(AttachmentConverters::class) +data class Message @JvmOverloads constructor( + @PrimaryKey(autoGenerate = true) + var id: Long = 0, + + var netId: String = "", + /** + *标题 + */ + var title: String = "", + /** + * 信息内容 + */ + var message: String = "", + /** + * 操作时间 + */ + var optionDate: String = "", + /** + * 发送时间 + */ + var sendDate: String = "", + /** + * 信息状态 + */ + var status: Int = 1, + /** + * 发送者ID + */ + var fromId: String = "", + /** + * 接收者ID + */ + var toId: String = "", + /** + * 附件列表 + */ + var attachment: MutableList = mutableListOf() +) \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/vivo/db/dao/entity/User.kt b/app/src/main/java/com/navinfo/volvo/db/dao/entity/User.kt similarity index 50% rename from app/src/main/java/com/navinfo/vivo/db/dao/entity/User.kt rename to app/src/main/java/com/navinfo/volvo/db/dao/entity/User.kt index b2329ee..91022fe 100644 --- a/app/src/main/java/com/navinfo/vivo/db/dao/entity/User.kt +++ b/app/src/main/java/com/navinfo/volvo/db/dao/entity/User.kt @@ -1,13 +1,13 @@ -package com.navinfo.vivo.db.dao.entity +package com.navinfo.volvo.db.dao.entity +import androidx.room.Entity import androidx.room.PrimaryKey -import java.net.IDN -class User( +@Entity(tableName = "User") +data class User( @PrimaryKey() val id:String, var name:String, var nickname:String, -) { -} \ No newline at end of file +) \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/volvo/tools/DisplayUtil.kt b/app/src/main/java/com/navinfo/volvo/tools/DisplayUtil.kt new file mode 100644 index 0000000..c93dccb --- /dev/null +++ b/app/src/main/java/com/navinfo/volvo/tools/DisplayUtil.kt @@ -0,0 +1,44 @@ +package com.navinfo.volvo.tools + +import android.content.Context + +class DisplayUtil { + companion object { + /** + * 获取屏幕宽度 + */ + fun getScreenWidth(context: Context): Int { + return context.resources.displayMetrics.widthPixels + } + + /** + * 获取屏幕高度 + */ + fun getScreenHeight(context: Context): Int { + return context.resources.displayMetrics.heightPixels + } + + /** + * 获取屏幕分辨率 + */ + fun getScreenRatio(context: Context): String { + return getScreenHeight(context).toString() + "X" + getScreenWidth(context).toString() + } + + /** + * dp转px + */ + fun dip2px(context: Context, dipValue: Float): Int { + val scale = context.resources.displayMetrics.density + return (dipValue * scale + 0.5f).toInt() + } + + /** + * px转dp + */ + fun px2dip(context: Context, pxValue: Float): Int { + val scale = context.resources.displayMetrics.density + return (pxValue / scale + 0.5f).toInt() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/volvo/tools/GsonUtil.kt b/app/src/main/java/com/navinfo/volvo/tools/GsonUtil.kt new file mode 100644 index 0000000..57e6d5f --- /dev/null +++ b/app/src/main/java/com/navinfo/volvo/tools/GsonUtil.kt @@ -0,0 +1,13 @@ +package com.navinfo.volvo.tools + +import com.google.gson.Gson + +class GsonUtil { + companion object { + fun getInstance() = InstanceHelper.gson + } + + object InstanceHelper { + val gson: Gson = Gson() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/volvo/ui/adapter/MessageAdapter.kt b/app/src/main/java/com/navinfo/volvo/ui/adapter/MessageAdapter.kt new file mode 100644 index 0000000..7a460c5 --- /dev/null +++ b/app/src/main/java/com/navinfo/volvo/ui/adapter/MessageAdapter.kt @@ -0,0 +1,54 @@ +package com.navinfo.volvo.ui.adapter + +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.navinfo.volvo.R +import com.navinfo.volvo.db.dao.entity.Message + +class MessageAdapter : RecyclerView.Adapter() { + + var itemList: MutableList = mutableListOf() + + fun addItem(message: Message) { + itemList.add(message) + notifyItemInserted(itemList.size - 1) + } + + fun setItem(messageList: MutableList){ + itemList = messageList + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder { + val view = + LayoutInflater.from(parent.context).inflate(R.layout.adapter_message, parent, false) + var viewHolder = MyViewHolder(view) + viewHolder.itemView.setOnClickListener { + + } + return viewHolder + } + + override fun onBindViewHolder(holder: MyViewHolder, position: Int) { + val message = itemList[position] + holder.toName.text = message.fromId + holder.messageText.text = message.message + holder.sendTime.text = message.sendDate + } + + override fun getItemCount(): Int { + return itemList.size + } + + inner class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + var image: ImageView = itemView.findViewById(R.id.message_head_icon) + var toName: TextView = itemView.findViewById(R.id.message_to_username) + var sendTime: TextView = itemView.findViewById(R.id.message_send_time) + var status: TextView = itemView.findViewById(R.id.message_status) + var messageText: TextView = itemView.findViewById(R.id.message_text) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/vivo/ui/dashboard/DashboardFragment.kt b/app/src/main/java/com/navinfo/volvo/ui/dashboard/DashboardFragment.kt similarity index 91% rename from app/src/main/java/com/navinfo/vivo/ui/dashboard/DashboardFragment.kt rename to app/src/main/java/com/navinfo/volvo/ui/dashboard/DashboardFragment.kt index 1ce55d1..9dda29c 100644 --- a/app/src/main/java/com/navinfo/vivo/ui/dashboard/DashboardFragment.kt +++ b/app/src/main/java/com/navinfo/volvo/ui/dashboard/DashboardFragment.kt @@ -1,4 +1,4 @@ -package com.navinfo.vivo.ui.dashboard +package com.navinfo.volvo.ui.dashboard import android.os.Bundle import android.view.LayoutInflater @@ -7,7 +7,7 @@ import android.view.ViewGroup import android.widget.TextView import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider -import com.navinfo.vivo.databinding.FragmentDashboardBinding +import com.navinfo.volvo.databinding.FragmentDashboardBinding class DashboardFragment : Fragment() { diff --git a/app/src/main/java/com/navinfo/vivo/ui/dashboard/DashboardViewModel.kt b/app/src/main/java/com/navinfo/volvo/ui/dashboard/DashboardViewModel.kt similarity index 88% rename from app/src/main/java/com/navinfo/vivo/ui/dashboard/DashboardViewModel.kt rename to app/src/main/java/com/navinfo/volvo/ui/dashboard/DashboardViewModel.kt index d040254..647da35 100644 --- a/app/src/main/java/com/navinfo/vivo/ui/dashboard/DashboardViewModel.kt +++ b/app/src/main/java/com/navinfo/volvo/ui/dashboard/DashboardViewModel.kt @@ -1,4 +1,4 @@ -package com.navinfo.vivo.ui.dashboard +package com.navinfo.volvo.ui.dashboard import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData diff --git a/app/src/main/java/com/navinfo/volvo/ui/home/HomeFragment.kt b/app/src/main/java/com/navinfo/volvo/ui/home/HomeFragment.kt new file mode 100644 index 0000000..6218058 --- /dev/null +++ b/app/src/main/java/com/navinfo/volvo/ui/home/HomeFragment.kt @@ -0,0 +1,92 @@ +package com.navinfo.volvo.ui.home + +import android.os.Bundle +import android.view.Display +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration +import androidx.recyclerview.widget.LinearLayoutManager +import com.navinfo.volvo.R +import com.navinfo.volvo.databinding.FragmentHomeBinding +import com.navinfo.volvo.tools.DisplayUtil +import com.navinfo.volvo.ui.adapter.MessageAdapter +import com.yanzhenjie.recyclerview.* +import com.yanzhenjie.recyclerview.SwipeRecyclerView.LoadMoreListener + +class HomeFragment : Fragment(), OnItemClickListener, OnItemMenuClickListener { + + private var _binding: FragmentHomeBinding? = null + + // This property is only valid between onCreateView and + // onDestroyView. + private val binding get() = _binding!! + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + val homeViewModel = + ViewModelProvider(this).get(HomeViewModel::class.java) + + _binding = FragmentHomeBinding.inflate(inflater, container, false) + val root: View = binding.root + + val recyclerview: SwipeRecyclerView = binding.homeMessageRecyclerview + recyclerview.adapter = null //先设置null,否则会报错 + //创建菜单选项 + //注意:使用滑动菜单不能开启滑动删除,否则只有滑动删除没有滑动菜单 + var mSwipeMenuCreator = + SwipeMenuCreator { _, rightMenu, position -> + //添加菜单自动添加至尾部 + var deleteItem = SwipeMenuItem(context) + deleteItem.height = DisplayUtil.dip2px(context!!, 60f) + deleteItem.width = DisplayUtil.dip2px(context!!, 80f) + deleteItem.background = context!!.getDrawable(R.color.red) + deleteItem.text = context!!.getString(R.string.delete) + rightMenu.addMenuItem(deleteItem) + + //分享 + var shareItem = SwipeMenuItem(context) + shareItem.height = DisplayUtil.dip2px(context!!, 60f) + shareItem.width = DisplayUtil.dip2px(context!!, 80f) + shareItem.background = context!!.getDrawable(R.color.gray) + shareItem.text = context!!.getString(R.string.share) + shareItem.setTextColor(R.color.white) + rightMenu.addMenuItem(shareItem) + + + } + val layoutManager = LinearLayoutManager(context) + val adapter = MessageAdapter() + recyclerview.layoutManager = layoutManager + recyclerview.addItemDecoration(DividerItemDecoration(context, layoutManager.orientation)) + recyclerview.setSwipeMenuCreator(mSwipeMenuCreator) + recyclerview.setOnItemClickListener(this) + recyclerview.useDefaultLoadMore() + recyclerview.setLoadMoreListener { + + } + recyclerview.adapter = adapter + homeViewModel.getMessageList().observe(viewLifecycleOwner, Observer { contacts -> + adapter.setItem(contacts) + }) + return root + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + + override fun onItemClick(view: View?, adapterPosition: Int) { + + } + + override fun onItemClick(menuBridge: SwipeMenuBridge?, adapterPosition: Int) { + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/volvo/ui/home/HomeViewModel.kt b/app/src/main/java/com/navinfo/volvo/ui/home/HomeViewModel.kt new file mode 100644 index 0000000..24af3e1 --- /dev/null +++ b/app/src/main/java/com/navinfo/volvo/ui/home/HomeViewModel.kt @@ -0,0 +1,34 @@ +package com.navinfo.volvo.ui.home + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import com.navinfo.volvo.db.dao.entity.Message + +class HomeViewModel : ViewModel() { + + private val messageList: LiveData> = + MutableLiveData>().apply { + value = mutableListOf() + value!!.add(Message()) + value!!.add(Message()) + value!!.add(Message()) + value!!.add(Message()) + value!!.add(Message()) + value!!.add(Message()) + value!!.add(Message()) + value!!.add(Message()) + value!!.add(Message()) + value!!.add(Message()) + value!!.add(Message()) + value!!.add(Message()) + value!!.add(Message()) + value!!.add(Message()) + value!!.add(Message()) + value!!.add(Message()) + } + + fun getMessageList(): LiveData> { + return messageList + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/vivo/ui/notifications/NotificationsFragment.kt b/app/src/main/java/com/navinfo/volvo/ui/notifications/NotificationsFragment.kt similarity index 91% rename from app/src/main/java/com/navinfo/vivo/ui/notifications/NotificationsFragment.kt rename to app/src/main/java/com/navinfo/volvo/ui/notifications/NotificationsFragment.kt index 924ccc8..80b8a27 100644 --- a/app/src/main/java/com/navinfo/vivo/ui/notifications/NotificationsFragment.kt +++ b/app/src/main/java/com/navinfo/volvo/ui/notifications/NotificationsFragment.kt @@ -1,4 +1,4 @@ -package com.navinfo.vivo.ui.notifications +package com.navinfo.volvo.ui.notifications import android.os.Bundle import android.view.LayoutInflater @@ -7,7 +7,7 @@ import android.view.ViewGroup import android.widget.TextView import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider -import com.navinfo.vivo.databinding.FragmentNotificationsBinding +import com.navinfo.volvo.databinding.FragmentNotificationsBinding class NotificationsFragment : Fragment() { diff --git a/app/src/main/java/com/navinfo/vivo/ui/notifications/NotificationsViewModel.kt b/app/src/main/java/com/navinfo/volvo/ui/notifications/NotificationsViewModel.kt similarity index 87% rename from app/src/main/java/com/navinfo/vivo/ui/notifications/NotificationsViewModel.kt rename to app/src/main/java/com/navinfo/volvo/ui/notifications/NotificationsViewModel.kt index 4f0881c..92a3e47 100644 --- a/app/src/main/java/com/navinfo/vivo/ui/notifications/NotificationsViewModel.kt +++ b/app/src/main/java/com/navinfo/volvo/ui/notifications/NotificationsViewModel.kt @@ -1,4 +1,4 @@ -package com.navinfo.vivo.ui.notifications +package com.navinfo.volvo.ui.notifications import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData diff --git a/app/src/main/java/com/navinfo/volvo/ui/widget/SlideRecyclerView.kt b/app/src/main/java/com/navinfo/volvo/ui/widget/SlideRecyclerView.kt new file mode 100644 index 0000000..16a9f38 --- /dev/null +++ b/app/src/main/java/com/navinfo/volvo/ui/widget/SlideRecyclerView.kt @@ -0,0 +1,187 @@ +package com.navinfo.volvo.ui.widget + +import android.annotation.SuppressLint +import android.content.Context +import android.graphics.Rect +import android.util.AttributeSet +import android.view.* +import android.widget.Scroller +import androidx.core.view.forEach +import androidx.recyclerview.widget.RecyclerView +import java.lang.Math.abs + +class SlideRecyclerView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : RecyclerView(context, attrs, defStyleAttr) { + //系统最小移动距离 + private val mTouchSlop = ViewConfiguration.get(context).scaledTouchSlop + + //最小有效速度 + private val mMinVelocity = 600 + + //增加手势控制,双击快速完成侧滑 + private var isDoubleClick = false + private var mGestureDetector: GestureDetector = + GestureDetector(context, object : GestureDetector.SimpleOnGestureListener() { + override fun onDoubleTap(e: MotionEvent?): Boolean { + e?.let { event -> + getSelectItem(event) + mItem?.let { + val deleteWith = it.getChildAt(it.childCount - 1).width + //触发移动至完全展开deleteWidth + if (it.scrollX == 0) { + mScroller.startScroll(0, 0, deleteWith, 0) + } else { + mScroller.startScroll(it.scrollX, 0, -it.scrollX, 0) + } + isDoubleClick = true + invalidate() + return true + } + } + //不进行拦截,只作为工具判断下双击 + return false + } + }) + + //使用速度控制器,增加侧滑速度判定滑动成功, + //VelocityTracker 由native实现,需要及时释放内存 + private var mVelocityTracker: VelocityTracker? = null + + //流畅滑动 + private var mScroller = Scroller(context) + + //当前选中item + private var mItem: ViewGroup? = null + + //上次按下的横坐标 + private var mLastX = 0f + + //当前RecyclerView被上层ViewGroup分发到事件,所有事件都会通过dispatchTouchEvent给到 + override fun dispatchTouchEvent(ev: MotionEvent?): Boolean { + mGestureDetector.onTouchEvent(ev) + return super.dispatchTouchEvent(ev) + } + + //viewGroup对子控件的事件拦截,一旦拦截,后续事件序列不会再调用onInterceptTouchEvent + override fun onInterceptTouchEvent(e: MotionEvent?): Boolean { + e?.let { + when (e.action) { + MotionEvent.ACTION_DOWN -> { + getSelectItem(e) + mLastX = e.x + } + MotionEvent.ACTION_MOVE -> { + //移动控件 + return moveItem(e) + } +// MotionEvent.ACTION_UP -> { +// stopMove(e) +// } + } + } + return super.onInterceptTouchEvent(e) + } + + @SuppressLint("ClickableViewAccessibility") + override fun onTouchEvent(e: MotionEvent?): Boolean { + e?.let { + when (e.action) { + MotionEvent.ACTION_MOVE -> { + moveItem(e) + mLastX = e.x + } + MotionEvent.ACTION_UP -> { + stopMove() + } + } + } + return super.onTouchEvent(e) + } + + //活动结束 + //判断一下结束的位置,补充或恢复位置 + private fun stopMove() { + mItem?.let { + //如果移动过半,判定左划成功 + val deleteWidth = it.getChildAt(it.childCount - 1).width + //如果整个移动过程速度大于600,也判定滑动成功 + //注意如果没有拦截ACTION_MOVE,mVelocityTracker是没有初始化的 + var velocity = 0f + mVelocityTracker?.let { tracker -> + tracker.computeCurrentVelocity(1000) + velocity = tracker.xVelocity + } + //判断结束情况,移动过半或者向左速度很快都展开 + if ((abs(it.scrollX) >= deleteWidth / 2f) || (velocity < -mMinVelocity)) { + //触发移动至完全展开 + mScroller.startScroll(it.scrollX, 0, deleteWidth - it.scrollX, 0) + invalidate() + } else { + //如果移动未过半应恢复状态 + mScroller.startScroll(it.scrollX, 0, -it.scrollX, 0) + invalidate() + } + } + //清除状态 + mLastX = 0f + //mVeloctityTracker由native实现,需要及时释放 + mVelocityTracker?.apply { + clear() + recycle() + } + mVelocityTracker = null + } + + //移动Item + //绝对值小于删除按钮长度随便移动,大于则不移动 + @SuppressLint("Recycle") + private fun moveItem(e: MotionEvent): Boolean { + mItem?.let { + val dx = mLastX - e.x + //最小的移动距离应该舍弃,onInterceptTouchEvent不拦截,onTouchEvent内才更新mLastX +// if (abs(dx) > mTouchSlop) { + //检查mItem移动后应该在【-deleteLength,0】内 + val deleteWith = it.getChildAt(it.childCount - 1).width + if ((it.scrollX + dx) <= deleteWith && (it.scrollX + dx) >= 0) { + //触发移动 + it.scrollBy(dx.toInt(), 0) + //触发速度计算 + //这里Rectycle不存在问题,一旦返回true,就会拦截事件,就会到达ACTION_UP去回收 + mVelocityTracker = mVelocityTracker ?: VelocityTracker.obtain() + mVelocityTracker!!.addMovement(e) + return true +// } + } + + + } + return false + } + + //获取点击位置 + //通过点击的y坐标除以Item高度得出 + private fun getSelectItem(e: MotionEvent) { + val frame = Rect() + mItem = null + forEach { + if (it.visibility != GONE) { + it.getHitRect(frame) + if (frame.contains(e.x.toInt(), e.y.toInt())) { + mItem = it as ViewGroup + } + } + } + } + + //流畅地滑动 + override fun computeScroll() { + if (mScroller.computeScrollOffset()) { + mItem?.scrollBy(mScroller.currX, mScroller.currY) + postInvalidate() + } + } +} + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 06ea6ca..ad25187 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -4,7 +4,7 @@ android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" - android:paddingTop="?attr/actionBarSize"> + > + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_dashboard.xml b/app/src/main/res/layout/fragment_dashboard.xml index 166ab0e..d137b00 100644 --- a/app/src/main/res/layout/fragment_dashboard.xml +++ b/app/src/main/res/layout/fragment_dashboard.xml @@ -4,7 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".ui.dashboard.DashboardFragment"> + tools:context="com.navinfo.volvo.ui.dashboard.DashboardFragment"> - + tools:context=".ui.home.HomeFragment" + > - - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/navigation/mobile_navigation.xml b/app/src/main/res/navigation/mobile_navigation.xml index 2b4cd1d..3665a94 100644 --- a/app/src/main/res/navigation/mobile_navigation.xml +++ b/app/src/main/res/navigation/mobile_navigation.xml @@ -7,19 +7,19 @@ \ No newline at end of file diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml index 12394cb..aada80e 100644 --- a/app/src/main/res/values-night/themes.xml +++ b/app/src/main/res/values-night/themes.xml @@ -1,6 +1,6 @@ -