Commit 14393818 authored by yinjiacheng's avatar yinjiacheng

add 选择自提点下拉刷新和上拉加载更多逻辑

parent 72e4725b
......@@ -10,6 +10,7 @@ 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.dto.PickupPointListDto
import com.yidian.shenghuoquan.border.viewmodel.SelectPickupPointViewModel
import com.yidian.xarc.xevent.XBaseEvent
import com.yidian.xarc.xevent.XEventManager
......@@ -34,6 +35,11 @@ class SelectPickupPointActivity : BaseMvvmActivity<BorderActivitySelectPickupPoi
}
}
/**
* 搜索关键字
*/
private var keyWords: String? = null
override fun getXPageName(): String {
return XRouterPathConstants.PICKUP_POINT_ACTIVITY
}
......@@ -41,6 +47,8 @@ class SelectPickupPointActivity : BaseMvvmActivity<BorderActivitySelectPickupPoi
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
XEventManager.register(this)
// 标记是否有当前位置
binding.location = params?.get(IntentConstants.KEY_EXTRA_LONGITUDE) != null && params?.get(IntentConstants.KEY_EXTRA_LATITUDE) != null
}
override fun onDestroy() {
......@@ -50,8 +58,9 @@ class SelectPickupPointActivity : BaseMvvmActivity<BorderActivitySelectPickupPoi
override fun initView() {
initRecyclerView()
initSmartRefresh()
registerUIEvent()
requestPickupPoint(null)
requestPickupPoint(SelectPickupPointViewModel.LoadType.SEARCH)
}
private fun initRecyclerView() {
......@@ -60,26 +69,50 @@ class SelectPickupPointActivity : BaseMvvmActivity<BorderActivitySelectPickupPoi
binding.rvPickupPointList.addItemDecoration(PickupPointListAdapter.PickupPointListItemDecoration())
}
private fun initSmartRefresh() {
binding.rlPickupPointList.setOnRefreshListener {
requestPickupPoint(SelectPickupPointViewModel.LoadType.REFRESH)
}
binding.rlPickupPointList.setOnLoadMoreListener {
requestPickupPoint(SelectPickupPointViewModel.LoadType.LOAD_MORE)
}
}
/**
* 注册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)
vm.pickupPointListSearch.observe(this, {
updateData(it)
})
vm.pickupPointListRefresh.observe(this, {
binding.rlPickupPointList.finishRefresh(it != null)
updateData(it)
})
vm.pickupPointListLoadMore.observe(this, {
binding.rlPickupPointList.finishLoadMore(it != null)
updateData(it)
})
}
/**
* 更新列表数据
*/
private fun updateData(data: PickupPointListDto?) {
// 标记当前选中的自提点
adapter.setSelectedId(params?.get(IntentConstants.KEY_EXTRA_PICKUP_POINT_ID)?.let { id -> id as Long })
adapter.updateData(data?.list)
}
/**
* 请求附近自提点
* 请求自提点列表
*/
private fun requestPickupPoint(keyWords: String?) {
private fun requestPickupPoint(type: SelectPickupPointViewModel.LoadType) {
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
keyWords, type
)
}
......@@ -87,12 +120,14 @@ class SelectPickupPointActivity : BaseMvvmActivity<BorderActivitySelectPickupPoi
fun onEvent(event: XBaseEvent?) {
when (event?.name) {
XEventConfig.SEARCH_PICKUP_POINT_CANCEL -> {
keyWords = null
// 取消搜索自提点 请求附近自提点
requestPickupPoint(null)
requestPickupPoint(SelectPickupPointViewModel.LoadType.SEARCH)
}
XEventConfig.SEARCH_PICKUP_POINT_START -> {
keyWords = event.body as String
// 开始搜索自提点
requestPickupPoint(event.body as String)
requestPickupPoint(SelectPickupPointViewModel.LoadType.SEARCH)
}
}
}
......
......@@ -14,32 +14,78 @@ import com.yidian.shenghuoquan.border.http.callback.IGetPickupPointListCallback
*/
class SelectPickupPointViewModel : BaseViewModel() {
private val _pickupPointListData = MutableLiveData<PickupPointListDto>()
val pickupPointListData: LiveData<PickupPointListDto> = _pickupPointListData
private val _pickupPointListSearch = MutableLiveData<PickupPointListDto?>()
val pickupPointListSearch: LiveData<PickupPointListDto?> = _pickupPointListSearch
private val _pickupPointListRefresh = MutableLiveData<PickupPointListDto?>()
val pickupPointListRefresh: LiveData<PickupPointListDto?> = _pickupPointListRefresh
private val _pickupPointListLoadMore = MutableLiveData<PickupPointListDto?>()
val pickupPointListLoadMore: LiveData<PickupPointListDto?> = _pickupPointListLoadMore
/**
* 记录分页请求下一页
*/
private var nextPage = 2
/**
* 请求自提点列表
*/
fun requestPickupPointList(marketingId: String, longitude: Double?, latitude: Double?, keyWords: String?) {
fun requestPickupPointList(
marketingId: String,
longitude: Double?,
latitude: Double?,
keyWords: String?,
type: LoadType,
page: Int = 1,
limit: Int = 20,
) {
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"
if (type == LoadType.SEARCH || type == LoadType.REFRESH) {
requestParams["page"] = page.toString()
} else {
requestParams["page"] = nextPage.toString()
}
requestParams["limit"] = limit.toString()
OrderRemoteDataSource.getPickupPointList(
object : IGetPickupPointListCallback {
override fun getPickupPointListSuccess(result: PickupPointListDto?) {
result?.let { _pickupPointListData.value = it }
if (type == LoadType.SEARCH || type == LoadType.REFRESH) nextPage = 2 else nextPage++
when (type) {
LoadType.SEARCH -> _pickupPointListSearch.value = result
LoadType.REFRESH -> _pickupPointListRefresh.value = result
LoadType.LOAD_MORE -> _pickupPointListLoadMore.value = result
}
}
override fun getPickupPointListFailure(message: String?) {
when (type) {
LoadType.SEARCH -> _pickupPointListSearch.value = null
LoadType.REFRESH -> _pickupPointListRefresh.value = null
LoadType.LOAD_MORE -> _pickupPointListLoadMore.value = null
}
}
}, requestParams
)
}
/**
* 列表加载类型
*/
enum class LoadType {
// 搜索
SEARCH,
// 下拉刷新
REFRESH,
// 上拉加载更多
LOAD_MORE
}
}
......@@ -4,10 +4,16 @@
<data>
<import type="android.view.View" />
<variable
name="vm"
type="com.yidian.shenghuoquan.border.viewmodel.SelectPickupPointViewModel" />
<variable
name="location"
type="Boolean" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
......@@ -43,11 +49,12 @@
android:text="@string/nearby_pickup_point"
android:textColor="@color/color_333333"
android:textSize="@dimen/sp16"
android:visibility="@{location ? View.VISIBLE : View.GONE}"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/sv_pickup_point_search" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_pickup_point_list"
<com.scwang.smart.refresh.layout.SmartRefreshLayout
android:id="@+id/rl_pickup_point_list"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginStart="@dimen/dp16"
......@@ -55,10 +62,17 @@
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"
app:layout_constraintTop_toBottomOf="@id/tv_nearby_pickup_point" />
app:layout_constraintTop_toBottomOf="@id/tv_nearby_pickup_point">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_pickup_point_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingStart="@dimen/dp16"
android:paddingEnd="@dimen/dp16" />
</com.scwang.smart.refresh.layout.SmartRefreshLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
\ No newline at end of file
......@@ -39,14 +39,15 @@
android:background="@null"
android:hint="@string/search_pickup_point"
android:imeOptions="actionSearch"
android:maxLines="1"
android:inputType="text"
android:maxLines="1"
android:textColor="@color/color_333333"
android:textColorHint="@color/color_666666"
android:textCursorDrawable="@drawable/shape_bg_input_cursor"
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_constraintStart_toEndOf="@id/iv_search"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
......
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