Commit 3045399f authored by yinjiacheng's avatar yinjiacheng

add 自提点搜索逻辑

parent a520beb8
......@@ -15,4 +15,16 @@ object IntentConstants {
// 订单id
const val KEY_EXTRA_ORDER_ID = "orderId"
// 活动id
const val KEY_EXTRA_MARKETING_ID = "marketingId"
// 经度
const val KEY_EXTRA_LONGITUDE = "longitude"
// 纬度
const val KEY_EXTRA_LATITUDE = "latitude"
// 自提点id
const val KEY_EXTRA_PICKUP_POINT_ID = "pickupPointId"
}
......@@ -26,5 +26,9 @@ class XEventConfig {
const val CONFIRM_ORDER_CHOOSE_POINT_SUCCESS = "confirm_order_choose_point_success"
// 确认订单选择优惠券成功
const val CONFIRM_ORDER_CHOOSE_COUPON_SUCCESS = "confirm_order_choose_coupon_success"
// 取消搜索自提点
const val SEARCH_PICKUP_POINT_CANCEL = "search_pickup_point_cancel"
// 开始搜索自提点
const val SEARCH_PICKUP_POINT_START = "search_pickup_point_start"
}
}
......@@ -8,6 +8,7 @@
android:name="com.yidian.shenghuoquan.border.ui.ConfirmOrderActivity"
android:windowSoftInputMode="adjustPan" />
<activity android:name="com.yidian.shenghuoquan.border.ui.OrderDetailActivity" />
<activity android:name="com.yidian.shenghuoquan.border.ui.SelectPickupPointActivity" />
</application>
</manifest>
\ No newline at end of file
......@@ -8,6 +8,7 @@ import androidx.databinding.DataBindingUtil
import androidx.recyclerview.widget.RecyclerView
import com.yidian.shenghuoquan.border.R
import com.yidian.shenghuoquan.border.databinding.BorderItemPickupPointListBinding
import com.yidian.shenghuoquan.border.dto.PickupPoint
import com.yidian.shenghuoquan.border.viewmodel.PickupPointListItemViewModel
import com.yidian.utils.DensityUtil
......@@ -16,7 +17,35 @@ import com.yidian.utils.DensityUtil
* date: 2021/8/24 16:57
* description: 自提点列表
*/
class PickupPointListAdapter : RecyclerView.Adapter<PickupPointListAdapter.PickupPointListViewHolder>() {
class PickupPointListAdapter(data: List<PickupPoint>?) : RecyclerView.Adapter<PickupPointListAdapter.PickupPointListViewHolder>() {
private val data by lazy { ArrayList<PickupPoint>() }
private var curSelectId = 0L
init {
data?.let {
this.data.addAll(it)
}
}
/**
* 更新数据
*/
fun updateData(data: List<PickupPoint>?) {
data?.let {
notifyItemRangeRemoved(0, this.data.size)
this.data.clear()
this.data.addAll(it)
notifyItemRangeInserted(0, this.data.size)
}
}
/**
* 设置当前选中的自提点id 默认0
*/
fun setSelectedId(id: Long?) {
curSelectId = id ?: 0
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PickupPointListViewHolder {
val binding = DataBindingUtil.inflate<BorderItemPickupPointListBinding>(
......@@ -30,10 +59,12 @@ class PickupPointListAdapter : RecyclerView.Adapter<PickupPointListAdapter.Picku
override fun onBindViewHolder(holder: PickupPointListViewHolder, position: Int) {
holder.binding.vm = PickupPointListItemViewModel()
holder.binding.data = data[position]
holder.binding.selectedId = curSelectId
}
override fun getItemCount(): Int {
return 0
return data.size
}
class PickupPointListViewHolder(itemView: View, val binding: BorderItemPickupPointListBinding) : RecyclerView.ViewHolder(itemView)
......
......@@ -3,6 +3,7 @@ package com.yidian.shenghuoquan.border.app
import com.yidian.bcommon.constant.XRouterPathConstants
import com.yidian.shenghuoquan.border.ui.ConfirmOrderActivity
import com.yidian.shenghuoquan.border.ui.OrderDetailActivity
import com.yidian.shenghuoquan.border.ui.SelectPickupPointActivity
/**
......@@ -13,6 +14,7 @@ object ClassMapUtil {
val xPageNodeMap = mapOf(
XRouterPathConstants.Companion.CONFIRM_ORDER_ACTIVITY to ConfirmOrderActivity::class.java, // 确认订单
XRouterPathConstants.Companion.ORDER_DETAIL_ACTIVITY to OrderDetailActivity::class.java, // 订单详情
XRouterPathConstants.Companion.PICKUP_POINT_ACTIVITY to SelectPickupPointActivity::class.java, // 选择自提点
)
}
......@@ -45,7 +45,7 @@ data class PickupPoint(
@SerializedName("province") // 省
val province: String,
@SerializedName("take_place_id") // 自提点id
val takePlaceId: Int,
val takePlaceId: Long,
@SerializedName("take_place_name") // 自提点名称
val takePlaceName: String,
@SerializedName("update_time")
......
package com.yidian.shenghuoquan.border.ui
import android.os.Bundle
import androidx.activity.viewModels
import androidx.recyclerview.widget.LinearLayoutManager
import com.yidian.bcommon.constant.IntentConstants
import com.yidian.bcommon.constant.XEventConfig
import com.yidian.bcommon.constant.XRouterPathConstants
import com.yidian.bcommon.mvvm.BaseMvvmActivity
import com.yidian.shenghuoquan.border.R
import com.yidian.shenghuoquan.border.adapter.PickupPointListAdapter
import com.yidian.shenghuoquan.border.databinding.BorderActivitySelectPickupPointBinding
import com.yidian.shenghuoquan.border.viewmodel.SelectPickupPointViewModel
import com.yidian.xarc.xevent.XBaseEvent
import com.yidian.xarc.xevent.XEventManager
import com.yidian.xpage.XPageViewProtocol
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
/**
* author: yinjiacheng
......@@ -20,14 +27,31 @@ class SelectPickupPointActivity : BaseMvvmActivity<BorderActivitySelectPickupPoi
override val layoutId = R.layout.border_activity_select_pickup_point
override val vm: SelectPickupPointViewModel by viewModels()
private val adapter by lazy { PickupPointListAdapter() }
private val adapter by lazy { PickupPointListAdapter(null) }
private val params by lazy {
intent.getSerializableExtra(XRouterPathConstants.ParamsKey)?.let {
it as HashMap<*, *>
}
}
override fun getXPageName(): String {
return XRouterPathConstants.PICKUP_POINT_ACTIVITY
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
XEventManager.register(this)
}
override fun onDestroy() {
super.onDestroy()
XEventManager.unRegister(this)
}
override fun initView() {
initRecyclerView()
registerUIEvent()
requestPickupPoint(null)
}
private fun initRecyclerView() {
......@@ -35,4 +59,41 @@ class SelectPickupPointActivity : BaseMvvmActivity<BorderActivitySelectPickupPoi
binding.rvPickupPointList.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
binding.rvPickupPointList.addItemDecoration(PickupPointListAdapter.PickupPointListItemDecoration())
}
/**
* 注册UI事件监听
*/
private fun registerUIEvent() {
vm.pickupPointListData.observe(this, {
// 标记当前选中的自提点
adapter.setSelectedId(params?.get(IntentConstants.KEY_EXTRA_PICKUP_POINT_ID)?.let { id -> id as Long })
adapter.updateData(it.list)
})
}
/**
* 请求附近自提点
*/
private fun requestPickupPoint(keyWords: String?) {
vm.requestPickupPointList(
params?.get(IntentConstants.KEY_EXTRA_MARKETING_ID) as String,
params?.get(IntentConstants.KEY_EXTRA_LONGITUDE)?.let { it as Double },
params?.get(IntentConstants.KEY_EXTRA_LATITUDE)?.let { it as Double },
keyWords
)
}
@Subscribe(sticky = false, threadMode = ThreadMode.MAIN)
fun onEvent(event: XBaseEvent?) {
when (event?.name) {
XEventConfig.SEARCH_PICKUP_POINT_CANCEL -> {
// 取消搜索自提点 请求附近自提点
requestPickupPoint(null)
}
XEventConfig.SEARCH_PICKUP_POINT_START -> {
// 开始搜索自提点
requestPickupPoint(event.body as String)
}
}
}
}
......@@ -4,12 +4,16 @@ import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.inputmethod.EditorInfo
import android.view.inputmethod.InputMethodManager
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.databinding.DataBindingUtil
import androidx.lifecycle.LifecycleOwner
import com.yidian.bcommon.constant.XEventConfig
import com.yidian.shenghuoquan.border.R
import com.yidian.shenghuoquan.border.databinding.BorderViewPickupPointSearchBinding
import com.yidian.shenghuoquan.border.viewmodel.PickupPointSearchViewModel
import com.yidian.xarc.xevent.XBaseEvent
import com.yidian.xarc.xevent.XEventManager
/**
* author: yinjiacheng
......@@ -34,11 +38,15 @@ class PickupPointSearchView @JvmOverloads constructor(context: Context, attrs: A
}
private fun initView() {
binding.etSearch.setOnEditorActionListener { v, actionId, event ->
binding.etSearch.setOnEditorActionListener { v, actionId, _ ->
if (actionId == EditorInfo.IME_ACTION_SEARCH) {
// TODO: 2021/8/24 请求搜索自提点
// 隐藏软键盘
val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(windowToken, 0)
// 通知开始搜索
XEventManager.post(XBaseEvent(XEventConfig.SEARCH_PICKUP_POINT_START, v.text.toString()))
}
false
true
}
}
......@@ -49,6 +57,8 @@ class PickupPointSearchView @JvmOverloads constructor(context: Context, attrs: A
vm.clearSearch.observe(context as LifecycleOwner, {
// 清空搜索框
binding.etSearch.setText("")
// 通知取消搜索
XEventManager.post(XBaseEvent(XEventConfig.SEARCH_PICKUP_POINT_CANCEL, null))
})
}
}
package com.yidian.shenghuoquan.border.viewmodel
import android.view.View
import android.view.ViewGroup
import androidx.core.view.MarginLayoutParamsCompat
import androidx.databinding.BindingAdapter
import com.yidian.bcommon.constant.XEventConfig
import com.yidian.bcommon.mvvm.BaseViewModel
import com.yidian.shenghuoquan.border.dto.PickupPoint
import com.yidian.utils.DensityUtil
import com.yidian.xarc.xevent.XBaseEvent
import com.yidian.xarc.xevent.XEventManager
import com.yidian.xpage.XPageManager
/**
* author: yinjiacheng
......@@ -8,4 +18,20 @@ import com.yidian.bcommon.mvvm.BaseViewModel
* description: 自提点列表
*/
class PickupPointListItemViewModel : BaseViewModel() {
companion object {
@JvmStatic
@BindingAdapter("layout_marginStart")
fun setMarginStart(view: View, margin: Int) {
MarginLayoutParamsCompat.setMarginStart(view.layoutParams as ViewGroup.MarginLayoutParams, DensityUtil.dp2px(margin.toFloat()))
}
}
/**
* 回传选择的自提点
*/
fun selectPickupPoint(data: PickupPoint) {
XEventManager.post(XBaseEvent(XEventConfig.CONFIRM_ORDER_CHOOSE_POINT_SUCCESS, data))
XPageManager.pop(null)
}
}
......@@ -20,6 +20,5 @@ class PickupPointSearchViewModel : BaseViewModel() {
*/
fun clearSearch() {
_clearSearch.value = Unit
// TODO: 2021/8/24 请求附近自提点
}
}
package com.yidian.shenghuoquan.border.viewmodel
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.yidian.bcommon.mvvm.BaseViewModel
import com.yidian.shenghuoquan.border.dto.PickupPointListDto
import com.yidian.shenghuoquan.border.http.OrderRemoteDataSource
import com.yidian.shenghuoquan.border.http.callback.IGetPickupPointListCallback
/**
* author: yinjiacheng
......@@ -9,4 +14,32 @@ import com.yidian.bcommon.mvvm.BaseViewModel
*/
class SelectPickupPointViewModel : BaseViewModel() {
private val _pickupPointListData = MutableLiveData<PickupPointListDto>()
val pickupPointListData: LiveData<PickupPointListDto> = _pickupPointListData
/**
* 请求自提点列表
*/
fun requestPickupPointList(marketingId: String, longitude: Double?, latitude: Double?, keyWords: String?) {
val requestParams = HashMap<String, String?>(6)
requestParams["marketing_id"] = marketingId
longitude?.let { requestParams["longitude"] = it.toString() }
latitude?.let { requestParams["latitude"] = it.toString() }
if (keyWords?.isNotEmpty() == true) requestParams["keywords"] = keyWords
requestParams["page"] = "1"
requestParams["limit"] = "20"
OrderRemoteDataSource.getPickupPointList(
object : IGetPickupPointListCallback {
override fun getPickupPointListSuccess(result: PickupPointListDto?) {
result?.let { _pickupPointListData.value = it }
}
override fun getPickupPointListFailure(message: String?) {
}
}, requestParams
)
}
}
......@@ -19,7 +19,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:CommonTopBarView_back_img="@drawable/icon_back_white"
app:CommonTopBarView_bg_color="@color/color_F6775B"
app:CommonTopBarView_bg_color="@color/color_FD7823"
app:CommonTopBarView_title_text="@string/order_detail"
app:CommonTopBarView_title_text_color="@color/white"
app:layout_constraintTop_toTopOf="parent" />
......
......@@ -20,7 +20,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:CommonTopBarView_back_img="@drawable/icon_back_white"
app:CommonTopBarView_bg_color="@color/color_F6775B"
app:CommonTopBarView_bg_color="@color/color_FD7823"
app:CommonTopBarView_title_text="@string/select_pickup_point"
app:CommonTopBarView_title_text_color="@color/white"
app:layout_constraintTop_toTopOf="parent" />
......@@ -54,6 +54,7 @@
android:layout_marginTop="@dimen/dp20"
android:layout_marginEnd="@dimen/dp16"
android:layout_marginBottom="@dimen/dp20"
android:background="@drawable/shape_solid_ffffff_corner_20"
android:paddingStart="@dimen/dp16"
android:paddingEnd="@dimen/dp16"
app:layout_constraintBottom_toBottomOf="parent"
......
......@@ -5,20 +5,32 @@
<data>
<import type="android.view.View" />
<variable
name="vm"
type="com.yidian.shenghuoquan.border.viewmodel.PickupPointListItemViewModel" />
<variable
name="data"
type="com.yidian.shenghuoquan.border.dto.PickupPoint" />
<variable
name="selectedId"
type="Long" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
android:layout_height="wrap_content"
android:onClick="@{() -> vm.selectPickupPoint(data)}">
<TextView
android:id="@+id/tv_pickup_point_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{data.takePlaceName}"
android:textColor="@color/color_333333"
android:textSize="@dimen/sp16"
app:layout_constraintStart_toStartOf="parent"
......@@ -29,8 +41,10 @@
android:id="@+id/tv_pickup_point_distance"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{@string/pickup_point_distance(data.distance)}"
android:textColor="@color/color_D66948"
android:textSize="@dimen/sp14"
android:visibility="@{data.distance != 0 ? View.VISIBLE : View.GONE}"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@id/tv_pickup_point_address"
tools:text="距您:2.7km" />
......@@ -39,6 +53,7 @@
android:layout_width="@dimen/dp1"
android:layout_height="@dimen/dp8"
android:background="@color/color_999999"
android:visibility="@{data.distance != 0 ? View.VISIBLE : View.GONE}"
app:layout_constraintBottom_toBottomOf="@id/tv_pickup_point_distance"
app:layout_constraintEnd_toStartOf="@id/tv_pickup_point_address"
app:layout_constraintStart_toEndOf="@id/tv_pickup_point_distance"
......@@ -48,12 +63,15 @@
android:id="@+id/tv_pickup_point_address"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp17"
android:layout_marginTop="@dimen/dp8"
android:ellipsize="end"
android:maxLines="1"
android:text="@{data.address}"
android:textColor="@color/color_999999"
android:textSize="@dimen/sp14"
app:layout_constraintStart_toEndOf="@id/tv_pickup_point_distance"
app:layout_constraintTop_toBottomOf="@id/tv_pickup_point_name"
app:layout_marginStart="@{data.distance != 0 ? 17 : 0}"
tools:text="经济技术开发区燕顺路123号" />
<TextView
......@@ -61,6 +79,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp8"
android:text="@{@string/pickup_point_contract_person(data.contactName)}"
android:textColor="@color/color_999999"
android:textSize="@dimen/sp14"
app:layout_constraintStart_toStartOf="parent"
......@@ -73,6 +92,7 @@
android:layout_height="@dimen/dp18"
android:background="@drawable/selector_pickup_point_select"
android:button="@null"
android:checked="@{selectedId == data.takePlaceId}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
......
......@@ -35,15 +35,18 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp4"
android:layout_marginEnd="@dimen/dp4"
android:background="@null"
android:hint="@string/search_pickup_point"
android:imeOptions="actionSearch"
android:maxLines="1"
android:inputType="text"
android:textColor="@color/color_333333"
android:textColorHint="@color/color_666666"
android:textSize="@dimen/sp14"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/iv_search"
app:layout_constraintEnd_toStartOf="@id/iv_clear"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
......
......@@ -28,4 +28,5 @@
<string name="search_pickup_point">搜索自提点名称/地址</string>
<string name="cancel">取消</string>
<string name="nearby_pickup_point">附近自提点</string>
<string name="pickup_point_distance">距您: %fkm</string>
</resources>
\ No newline at end of file
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