GoodsFragment.kt通过slhlv.setOnScrollListener来监听右侧的滑动事件,当左侧的type和右侧的type不一致的时候再刷新左侧的条目
package com.example.takeout.ui.fragment
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.AbsListView
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.example.takeout.R
import com.example.takeout.model.beans.GoodsInfo
import com.example.takeout.model.beans.GoodsTypeInfo
import com.example.takeout.presenter.GoodsFragmentPresenter
import com.example.takeout.ui.adapter.GoodsAdapter
import com.example.takeout.ui.adapter.GoodsTypeRvAdapter
import org.jetbrains.anko.find
import se.emilsjolander.stickylistheaders.StickyListHeadersListView
/**
* 详情页商品列表界面
*/
class GoodsFragment : Fragment() {
lateinit var rvGoodsType: RecyclerView //左侧的RecyclerView
lateinit var slhlv: StickyListHeadersListView //
lateinit var goodsFragmentPresenter: GoodsFragmentPresenter
lateinit var goodsTypeAdapter :GoodsTypeRvAdapter
lateinit var goodsAdapter: GoodsAdapter
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val goodsView =
LayoutInflater.from(activity).inflate(R.layout.fragment_goods, container, false)
rvGoodsType = goodsView.find(R.id.rv_goods_type)
slhlv = goodsView.find<StickyListHeadersListView>(R.id.slhlv)
goodsAdapter = GoodsAdapter(activity,this)
slhlv.adapter = goodsAdapter
rvGoodsType.layoutManager = LinearLayoutManager(activity)
goodsTypeAdapter = GoodsTypeRvAdapter(activity, this)
rvGoodsType.adapter = goodsTypeAdapter
goodsFragmentPresenter = GoodsFragmentPresenter(this)
return goodsView
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
goodsFragmentPresenter.getBusinessInfo()
}
fun onLoadBusinessSuccess(goodstypeList: List<GoodsTypeInfo>, allTypeGoodsList: ArrayList<GoodsInfo>) {
goodsTypeAdapter.setDatas(goodstypeList) //左侧列表//右侧列表
goodsAdapter.setDatas(allTypeGoodsList)
// goodsTypeAdapter.notifyDataSetChanged()
slhlv.setOnScrollListener(object : AbsListView.OnScrollListener{
override fun onScroll(
view: AbsListView?,
firstVisibleItem: Int,
visibleItemCount: Int,
totalItemCount: Int
) {
//先找出旧的类别
val oldPosition = goodsTypeAdapter.selectPosition
val newTypeId = goodsFragmentPresenter.allTypeGoodsList.get(firstVisibleItem).typeId
//把新的id找到它对应的position
val newPositon = goodsFragmentPresenter.getTypePositionByTypeId(newTypeId)
//当newPositon与旧的不同时,证明需要切换类别了
if(newPositon!=oldPosition){
goodsTypeAdapter.selectPosition = newPositon
goodsTypeAdapter.notifyDataSetChanged()
}
}
override fun onScrollStateChanged(view: AbsListView?, scrollState: Int) {
}
})
}
}
GoodsFragmentPresenter.kt根据类别id找到其在左侧列表中的position,遍历左侧的列表
package com.example.takeout.presenter
import android.util.Log
import com.example.takeout.model.beans.GoodsInfo
import com.example.takeout.model.beans.GoodsTypeInfo
import com.example.takeout.ui.fragment.GoodsFragment
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import org.json.JSONObject
class GoodsFragmentPresenter(val goodsFragment: GoodsFragment) : NetPresenter() {
var goodstypeList: List<GoodsTypeInfo> = arrayListOf()
val allTypeGoodsList: ArrayList<GoodsInfo> = arrayListOf()
//连接服务器拿到此商家所有商品
fun getBusinessInfo() {
val businessCall = takeoutService.getBusinessInfo()
businessCall.enqueue(callback)
}
override fun parserJson(json: String) {
val gson = Gson()
val jsoObj = JSONObject(json)
val allStr = jsoObj.getString("list")
//商品类型的集合
goodstypeList = gson.fromJson(allStr, object : TypeToken<List<GoodsTypeInfo>>() {
}.type)
Log.e("business", "该商家一共有" + goodstypeList.size + "个类别商品")
for (i in 0 until goodstypeList.size) {
val goodsTypeInfo = goodstypeList.get(i)
var aTypeCount = 0
val aTypeList: List<GoodsInfo> = goodsTypeInfo.list
for (j in 0 until aTypeList.size) {
val goodsInfo = aTypeList.get(j)
//建立双向绑定关系
goodsInfo.typeName = goodsTypeInfo.name
goodsInfo.typeId = goodsTypeInfo.id
}
allTypeGoodsList.addAll(goodsTypeInfo.list)
}
goodsFragment.onLoadBusinessSuccess(goodstypeList, allTypeGoodsList)
}
//根据商品类别id找到此类别第一个商品的位置
fun getGoodsPositionByTypeId(typeId: Int): Int {
var position = -1 //-1表示未找到
for(j in 0 until allTypeGoodsList.size){
val goodsInfo = allTypeGoodsList.get(j)
if(goodsInfo.typeId == typeId){
position = j
break;
}
}
return position
}
//根据类别id找到其在左侧列表中的position,遍历左侧的列表
fun getTypePositionByTypeId(newTypeId: Int):Int {
var position = -1 //-1表示未找到
for(i in 0 until goodstypeList.size){
val goodsTypeInfo = goodstypeList.get(i)
if(goodsTypeInfo.id == newTypeId){
position = i
break;
}
}
return position
}
}
效果如下: