Koltin39.Takeout首页详情界面滑动右侧的条目,左侧的条目也随之变化化(24)

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
    }
}

效果如下:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值