Commit 3064de6c authored by fengruiyu's avatar fengruiyu

搜索页面历史记录的功能已完成(包含境内和境外的功能)

搜索回调到地图页面的功能已完成
parent 79a9f635
......@@ -190,11 +190,13 @@ dependencies {
//room数据库
def room_version = "2.3.0"
implementation("androidx.room:room-runtime:$room_version")
annotationProcessor "androidx.room:room-compiler:$room_version"
// optional - Kotlin Extensions and Coroutines support for Room
implementation("androidx.room:room-ktx:$room_version")
// optional - Test helpers
testImplementation("androidx.room:room-testing:$room_version")
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version" // use kapt for Kotlin
// optional - RxJava support for Room
implementation "androidx.room:room-rxjava2:$room_version"
// optional - Guava support for Room, including Optional and ListenableFuture
implementation "androidx.room:room-guava:$room_version"
// Test helpers
testImplementation "androidx.room:room-testing:$room_version"
}
\ No newline at end of file
package com.mints.street.adapter
import android.content.Context
import android.content.Intent
import android.text.TextUtils
import android.view.View
import androidx.databinding.ViewDataBinding
import com.alibaba.android.vlayout.layout.LinearLayoutHelper
import com.fry.base.adapter.AbstractVLayoutBaseAdapter
......@@ -9,55 +10,95 @@ import com.fry.base.adapter.BindingViewHolder
import com.fry.base.recycler_view.VHMAdapter
import com.fry.base.recycler_view.VHModel
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.mints.street.BR
import com.mints.street.R
import com.mints.street.bean.HistoryBean
import com.mints.street.databinding.ItemHistoryRecordAdapterBinding
import com.mints.street.main.home.SearchMapActivity
import com.mints.street.main.home.SearchMapViewModel
import me.goldze.mvvmhabit.binding.command.BindingAction
import me.goldze.mvvmhabit.binding.command.BindingCommand
import me.goldze.mvvmhabit.utils.KLog
import me.goldze.mvvmhabit.utils.RxUtils
import me.goldze.mvvmhabit.utils.SPUtils
import java.lang.reflect.Type
/**
* Created by 冯瑞雨 on 2021/7/14.
* 历史记录的adapter
*/
class HistoryRecordAdapter(val context: Context, var name: String? = null) :
AbstractVLayoutBaseAdapter<ItemHistoryRecordAdapterBinding, String>(context, name, 1) {
class HistoryRecordAdapter(val activity: SearchMapActivity,val viewModel: SearchMapViewModel
, var type: Int=0,var name: String? = null) :
AbstractVLayoutBaseAdapter<ItemHistoryRecordAdapterBinding, String>(activity, name, 1) {
var listName: List<String>? = getHistoryData()
var listName: MutableList<HistoryBean>?=null
var binding:ItemHistoryRecordAdapterBinding?= null
override fun onBindViewHolder(
holder: BindingViewHolder<ItemHistoryRecordAdapterBinding>,
position: Int
) {
binding = holder.binding
listName = getHistoryData()
if (listName!=null && listName!!.size>0){
binding?.historyBg?.visibility = View.VISIBLE
}else{
binding?.historyBg?.visibility = View.GONE
}
val adapter = VHMAdapter<HistoryRecordItemVHM>()
listName?.apply {
for (items in this) {
adapter.add(HistoryRecordItemVHM(items))
listName?.let {
for (index in it.size - 1 downTo 0) {
adapter.add(HistoryRecordItemVHM(activity,viewModel,it[index]))
}
}
holder.binding.listView.adapter = adapter
//清空
RxUtils.onMultiClick(binding?.tvClear){
listName?.clear()
SPUtils.getInstance(SearchMapActivity.HISTORY_NAME)
.removeKey(if (type==0){"Territory"}else{"Abroad"})
binding?.historyBg?.visibility = View.GONE
notifyDataSetChanged()
}
}
private fun getHistoryData(): List<String>? {
private fun getHistoryData(): MutableList<HistoryBean>? {
val instance = SPUtils.getInstance(SearchMapActivity.HISTORY_NAME)
val string = instance.decodeString("name")
if (TextUtils.isEmpty(string)){
val string = instance.decodeString(if (type==0){"Territory"}else{"Abroad"})
if (TextUtils.isEmpty(string)) {
return null
}
return Gson().fromJson<List<String>>(string, List::class.java)
return try {
val listType: Type = object : TypeToken<List<HistoryBean?>?>() {}.type
Gson().fromJson(string, listType)
}catch (e:Exception){
null
}
}
fun addHistoryData(addName:String) {
val instance = SPUtils.getInstance(SearchMapActivity.HISTORY_NAME)
if (listName ==null ){
listName = ArrayList<String>()
fun addHistoryData(addName: HistoryBean) {
if (listName == null) {
listName = ArrayList<HistoryBean>()
}
for (index in listName!!.indices){
if (listName!![index] == addName || addName == listName!![index]){
if (listName?.size ?: 0 >= 15) {
val size = listName!!.size - 15
for (index in 0..size) {
listName?.removeAt(index)
}
}
instance?.encode("name", Gson().toJson(listName).toString())
for (index in listName!!.indices) {
if (listName!![index].name == addName.name) {
listName?.removeAt(index)
break
}
}
if (listName!=null && listName!!.size>0 && binding?.historyBg?.visibility == View.GONE){
binding?.historyBg?.visibility = View.VISIBLE
}
listName?.add(addName)
val instance = SPUtils.getInstance(SearchMapActivity.HISTORY_NAME)
instance?.encode(if (type==0){"Territory"}else{"Abroad"}, Gson().toJson(listName).toString())
}
override fun getItemCount() = 1
......@@ -68,8 +109,8 @@ class HistoryRecordAdapter(val context: Context, var name: String? = null) :
}
class HistoryRecordItemVHM(
var name: String
class HistoryRecordItemVHM(val activity: SearchMapActivity,val viewModel: SearchMapViewModel,
var historyBean: HistoryBean
) : VHModel() {
override fun getLayoutId() = R.layout.item_history_record_name
......@@ -79,4 +120,13 @@ class HistoryRecordItemVHM(
super.onBind(binding)
}
val onClick = BindingCommand<Any>(BindingAction {
activity.goTOSearch(historyBean.name)
viewModel.searchName.value = HistoryBean(name = historyBean.name,
latitude = historyBean.latitude,longitude = historyBean.longitude)
val intent = Intent()
intent.putExtra("latitude",historyBean.latitude)
intent.putExtra("longitude",historyBean.longitude)
viewModel.finishData(SearchMapActivity.REQUEST_CODE,intent)
})
}
\ No newline at end of file
......@@ -21,6 +21,11 @@ import me.goldze.mvvmhabit.utils.RxUtils
class PopularSceneAdapter(val context: Context, var list: List<Places>? = null) :
AbstractVLayoutBaseAdapter<ItemPopularSceneAdapterBinding, List<Places>>(context, list, 2) {
fun setData(list: List<Places>?){
this.list = list
notifyDataSetChanged()
}
override fun onBindViewHolder(
holder: BindingViewHolder<ItemPopularSceneAdapterBinding>,
position: Int
......@@ -31,6 +36,7 @@ class PopularSceneAdapter(val context: Context, var list: List<Places>? = null)
,longitude = list?.get(position)?.longitude.toString())
}
holder.binding.tvName.text = list?.get(position)?.name
if(list?.get(position)?.images!=null){
for ( index in list?.get(position)?.images!!.indices){
if (list?.get(position)?.images?.get(index)==null)return
......
package com.mints.street.bean
/**
* Created by 冯瑞雨 on 2021/7/21.
*/
class HistoryBean (
var name:String?=null,
var latitude:Double?=null,
var longitude:Double?=null
)
\ No newline at end of file
package db
package com.mints.street.db
import androidx.room.Database
import androidx.room.Room
......@@ -22,7 +22,7 @@ abstract class AppDatabase : RoomDatabase() {
_instance = Room.databaseBuilder(
Utils.getContext()
, AppDatabase::class.java
, "mints_room.db")
, "mints_room.com.mints.street.db")
.allowMainThreadQueries()//设置是否允许在主线程做查询操作
//.fallbackToDestructiveMigration()//设置迁移数据库如果发生错误,将会重新创建数据库,而不是发生崩溃
.build()
......
package db
package com.mints.street.db
import androidx.room.Dao
import androidx.room.Query
import java.util.*
/**
* Created by 冯瑞雨 on 2021/7/20.
......
package db
package com.mints.street.db
import androidx.room.Entity
import androidx.room.PrimaryKey
import java.util.*
/**
* Created by 冯瑞雨 on 2021/7/20.
......
......@@ -107,7 +107,7 @@ class HomeFragment : BaseFragment<FragmentHomeBinding, HomeViewModel>(), SensorE
if (it==null)return@Observer
// 默认 天安门
val center = LatLng(it["latitude"] ?:39.915071, it["longitude"] ?:116.403907)
setNewMapStatus(center)
})
}
......@@ -115,7 +115,6 @@ class HomeFragment : BaseFragment<FragmentHomeBinding, HomeViewModel>(), SensorE
mBaiduMap = binding.bmapView.map
mBaiduMap?.mapType = BaiduMap.MAP_TYPE_SATELLITE
//设置是否显示缩放控件
binding.bmapView.showZoomControls(false)
// 构建地图状态
......@@ -353,4 +352,17 @@ class HomeFragment : BaseFragment<FragmentHomeBinding, HomeViewModel>(), SensorE
override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) {
}
/**
* 设置地图新状态
*
* @param v
*/
private fun setNewMapStatus(latLng :LatLng) {
val builder = MapStatus.Builder()
builder.target(latLng).zoom(18.5f).overlook(-21f).rotate(0f)
// 更新地图状态
mBaiduMap!!.setMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()))
//mMarker.setPosition(latLng)
}
}
\ No newline at end of file
......@@ -61,6 +61,7 @@ class HomeViewModel(application: Application):BaseViewModel(application) {
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
if (requestCode == 200 && resultCode == SearchMapActivity.REQUEST_CODE){
KLog.a("homeFragment onActivityResult")
data?.let {
val map = HashMap<String,Double>(2)
map["latitude"] = it.getDoubleExtra("latitude",0.0)
......
......@@ -2,6 +2,7 @@ package com.mints.street.main.home
import android.content.Intent
import com.baidu.mapapi.model.LatLng
import com.mints.street.bean.HistoryBean
import me.goldze.mvvmhabit.base.AppManager
import me.goldze.mvvmhabit.base.ItemViewModel
import me.goldze.mvvmhabit.binding.command.BindingAction
......@@ -18,12 +19,11 @@ class SearchAfterItem(viewModel: SearchMapViewModel,val name:String?
* 点击名称回调回调
*/
val onClick = BindingCommand<Any>(BindingAction {
viewModel.searchName.value = HistoryBean(name = this.name,
latitude = pt?.latitude,longitude = pt?.longitude)
val intent = Intent()
intent.putExtra("latitude",pt?.latitude)
intent.putExtra("longitude",pt?.longitude)
viewModel.finishData(SearchMapActivity.REQUEST_CODE,intent)
// KLog.e("SearchAfterItem","key : $name")
// KLog.e("SearchAfterItem","latitude : ${pt?.latitude}")
// KLog.e("SearchAfterItem","longitude : ${pt?.longitude}")
})
}
\ No newline at end of file
......@@ -18,9 +18,9 @@ import com.mints.street.BR
import com.mints.street.R
import com.mints.street.adapter.HistoryRecordAdapter
import com.mints.street.adapter.PopularSceneAdapter
import com.mints.street.bean.HistoryBean
import com.mints.street.bean.MapBean
import com.mints.street.databinding.ActivitySearchMapBinding
import me.goldze.mvvmhabit.base.AppManager
import me.goldze.mvvmhabit.utils.KLog
/**
......@@ -30,9 +30,12 @@ class SearchMapActivity : BaseActivity<ActivitySearchMapBinding, SearchMapViewMo
OnGetSuggestionResultListener {
companion object {
const val HISTORY_NAME = "history_name"
const val REQUEST_CODE = 201
const val REQUEST_CODE = 201
fun startSearchMapActivity(fragment: HomeFragment) {
fragment.startActivityForResult(Intent(fragment.context, SearchMapActivity::class.java),REQUEST_CODE)
fragment.startActivityForResult(
Intent(fragment.context, SearchMapActivity::class.java),
200
)
}
}
......@@ -75,19 +78,17 @@ class SearchMapActivity : BaseActivity<ActivitySearchMapBinding, SearchMapViewMo
viewModel.searchAfterOneItems.clear()
return
}
// 使用建议搜索服务获取建议列表,结果在onSuggestionResult()中更新
mSuggestionSearch?.requestSuggestion(
SuggestionSearchOption()
.keyword(s.toString()) // 关键字
.city(viewModel.positioningBean?.city ?: "北京")
) // 城市
)
}
})
historyRecordAdapter = HistoryRecordAdapter(this)
historyRecordAdapter = HistoryRecordAdapter(this,viewModel)
popularSceneAdapter = PopularSceneAdapter(this)
......@@ -107,24 +108,21 @@ class SearchMapActivity : BaseActivity<ActivitySearchMapBinding, SearchMapViewMo
}
fun goTOSearch(text:String?){
binding.et.setSelection(text?.length?:0)
}
private fun update() {
mAdapter?.clear()
if (viewModel.index == 0) {
historyRecordAdapter?.apply {
mAdapter?.addAdapter(historyRecordAdapter)
}
} else {
mAdapter?.removeAdapter(historyRecordAdapter)
historyRecordAdapter?.apply {
this.type = viewModel.index
}
popularSceneAdapter?.apply {
if (viewModel.index==0){
this.list = viewModel.mapBean.value?.innerPlaces?.places
}else{
this.list = viewModel.mapBean.value?.outerPlaces?.places
if (viewModel.index == 0) {
this.data = viewModel.mapBean.value?.innerPlaces?.places
} else {
this.data = viewModel.mapBean.value?.outerPlaces?.places
}
mAdapter?.addAdapter(popularSceneAdapter)
}
mAdapter?.notifyDataSetChanged()
}
override fun initViewObservable() {
......@@ -133,6 +131,12 @@ class SearchMapActivity : BaseActivity<ActivitySearchMapBinding, SearchMapViewMo
update()
}
})
viewModel.searchName.observe(this, Observer<HistoryBean> {
if (TextUtils.isEmpty(it.name)){
return@Observer
}
historyRecordAdapter?.addHistoryData(it)
})
}
private fun territory() {
......@@ -166,12 +170,15 @@ class SearchMapActivity : BaseActivity<ActivitySearchMapBinding, SearchMapViewMo
}
viewModel.searchAfterOneItems.clear()
if(TextUtils.isEmpty(binding.et.text)){
if (TextUtils.isEmpty(binding.et.text)) {
return
}
for (info in suggestionResult.allSuggestions) {
viewModel.searchAfterOneItems.add(SearchAfterItem(viewModel
,info.key,info.address,info.pt))
viewModel.searchAfterOneItems.add(
SearchAfterItem(
viewModel, info.key, info.address, info.pt
)
)
}
}
}
\ No newline at end of file
package com.mints.street.main.home
import android.app.Application
import android.content.Intent
import android.text.TextUtils
import android.view.View
import androidx.databinding.ObservableArrayList
......@@ -8,11 +9,13 @@ import androidx.lifecycle.MutableLiveData
import com.google.gson.Gson
import com.mints.street.BR
import com.mints.street.R
import com.mints.street.bean.HistoryBean
import com.mints.street.bean.MapBean
import com.mints.street.bean.Places
import com.mints.street.bean.PositioningBean
import me.goldze.mvvmhabit.base.AppManager
import me.goldze.mvvmhabit.base.BaseViewModel
import me.goldze.mvvmhabit.binding.command.BindingAction
import me.goldze.mvvmhabit.binding.command.BindingCommand
import me.goldze.mvvmhabit.utils.KLog
import me.goldze.mvvmhabit.utils.SPUtils
......@@ -28,6 +31,8 @@ class SearchMapViewModel(application: Application) : BaseViewModel(application)
val searchAfterItemBinding = ItemBinding.of<SearchAfterItem>(BR.viewModel, R.layout.item_search_after)
val searchAfterOneItems = ObservableArrayList<SearchAfterItem>()
//搜索的name
val searchName = MutableLiveData<HistoryBean>()
//定位位置
val positioningBean: PositioningBean? =getpositioningMap()
......
......@@ -4,5 +4,6 @@
<!-- 边框的颜色和粗细 -->
<solid android:color="#ffffffff" />
<corners android:radius="81dp" />
<stroke android:width="0.5dp" android:color="#D1D1D1"/>
</shape>
\ No newline at end of file
......@@ -3,27 +3,35 @@
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="match_parent"
android:background="@color/white"
>
<View
android:id="@+id/view_bg"
android:layout_width="match_parent"
android:layout_height="150dp"
android:layout_height="120dp"
android:background="#668BFF"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.fry.base.ui.widget.CommonTitleBar
android:id="@+id/ctb_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:ctb_theme="dark"
app:layout_constraintTop_toTopOf="parent" />
<LinearLayout
android:layout_marginBottom="10dp"
android:id="@+id/ll_title_bg"
android:layout_width="120dp"
android:layout_height="30dp"
android:gravity="center"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@id/ctb_title"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@id/ctb_title">
>
<com.coorchice.library.SuperTextView
android:id="@+id/territory"
......@@ -79,10 +87,12 @@
android:hint="请输入地址"
android:paddingStart="45dp"
android:paddingEnd="10dp"
android:textColor="@color/color_8F6D21"
android:textColor="@color/color_555"
android:textColorHint="#E1E1E1"
android:textCursorDrawable="@drawable/cursor_color"
android:textSize="14sp"
android:singleLine="true"
android:maxLines="1"
app:layout_constraintBottom_toBottomOf="@id/view_bg"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
......@@ -98,12 +108,7 @@
app:layout_constraintStart_toStartOf="@id/et"
app:layout_constraintTop_toTopOf="@id/et" />
<com.fry.base.ui.widget.CommonTitleBar
android:id="@+id/ctb_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:ctb_theme="dark"
app:layout_constraintTop_toTopOf="parent" />
<com.fry.base.ui.widget.CustomRecycleView
android:id="@+id/recy_after_search"
......
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:app="http://schemas.android.com/apk/res-auto">
<layout xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="adpter"
......@@ -9,8 +10,10 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:id="@+id/bg"
>
<LinearLayout
android:id="@+id/history_bg"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
......@@ -33,8 +36,9 @@
android:textSize="14sp"
/>
<TextView
android:id="@+id/tv_clear"
android:padding="10dp"
android:drawableStart="@mipmap/icon_search_history"
android:drawableStart="@mipmap/trash_can_icon"
android:drawablePadding="5dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
......@@ -52,5 +56,18 @@
app:useDivider="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView
android:layout_marginTop="5dp"
android:layout_marginBottom="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="热门景区"
android:textSize="15sp"
android:textColor="@color/color_323334"
android:textStyle="bold"
android:drawableStart="@mipmap/popular_scenic_spots_icon"
android:paddingStart="10dp"
android:drawablePadding="5dp"
/>
</LinearLayout>
</layout>
\ No newline at end of file
......@@ -9,14 +9,15 @@
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="20dp"
android:textSize="14sp"
android:textSize="12sp"
android:gravity="center"
android:text="@{vhm.name}"
android:text="@{vhm.historyBean.name}"
android:textColor="@color/color_555"
app:stv_stroke_color="@color/color_555"
app:stv_stroke_width="1dp"
app:stv_stroke_width="0.5dp"
app:stv_corner="10dp"
android:paddingStart="5dp"
android:paddingEnd="5dp"
android:paddingStart="10dp"
android:paddingEnd="10dp"
app:onClickCommand="@{vhm.onClick}"
/>
</layout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:app="http://schemas.android.com/apk/res-auto">
<layout xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
......@@ -10,14 +11,17 @@
<ImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:src="@mipmap/map_history_icon"
android:layout_marginStart="10dp"
android:layout_width="20dp"
android:layout_height="20dp"
android:src="@mipmap/positioning_small_icon"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:layout_marginStart="10dp"
android:id="@+id/tv_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
......@@ -32,20 +36,23 @@
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:layout_marginStart="10dp"
android:id="@+id/tv_address"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:maxLines="1"
android:singleLine="true"
android:text="@{viewModel.address}"
android:textColor="@color/color_555"
android:textColor="@color/color_333"
android:textSize="10sp"
tools:text="dsfdsfds"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/image"
app:layout_constraintTop_toBottomOf="@id/tv_name" />
<View
android:layout_marginStart="10dp"
android:layout_width="0dp"
android:layout_height="0.5dp"
app:layout_constraintBottom_toBottomOf="parent"
......
......@@ -10,6 +10,7 @@
<color name="color_668BFF">#668BFF</color>
<color name="color_7EE2FF">#7EE2FF</color>
<color name="color_A7BCFE">#A7BCFE</color>
<color name="color_323334">#323334</color>
<color name="color_333">#333333</color>
<color name="color_172B54">#172B54</color>
<color name="color_121B32">#121B32</color>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment