Koltin23.参考上一节Takeout首页Retrofit请求takeout数据(9)

HomeFragment.kt在onHomeSuccess中接受到presenter传递来的服务器请求的数据,重新整理并刷新界面

package com.example.takeout.ui.fragment

import android.app.Fragment
import android.graphics.Color
import android.os.Bundle
import android.util.Log
import android.util.TypedValue
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.example.takeout.R
import com.example.takeout.presenter.HomeFragmentPresenster
import com.example.takeout.ui.adapter.HomeRvAdapter
import com.heima.takeout.model.beans.Seller
import kotlinx.android.synthetic.main.fragment_home.*
import org.jetbrains.anko.find
import org.jetbrains.anko.toast

class HomeFragment : Fragment() {
    lateinit var homeRvAdapter: HomeRvAdapter//延迟初始化
    lateinit var rvHome: RecyclerView
    lateinit var homeFragmentPresenster: HomeFragmentPresenster

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val view = View.inflate(activity, R.layout.fragment_home, null)
        rvHome = view.find<RecyclerView>(R.id.rv_home)
        //上下布局
        rvHome.layoutManager = LinearLayoutManager(activity)
        homeRvAdapter = HomeRvAdapter(activity)
        rvHome.adapter = homeRvAdapter
        homeFragmentPresenster = HomeFragmentPresenster(this)

        distance = 120.dp2px()
        return view
    }

    fun Int.dp2px(): Int {
        return TypedValue.applyDimension(
            TypedValue.COMPLEX_UNIT_DIP,
            toFloat(), resources.displayMetrics
        ).toInt()

    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        initData()
    }

    val datas: ArrayList<Seller> = ArrayList<Seller>()
    var sum: Int = 0
    var distance: Int = 0
    var alpha = 55
    private fun initData() {
//        for (i in 0 until 100) {
//            datas.add("我是商家:" + i)
//        }
        homeFragmentPresenster.getHomeInfo()
//        homeRvAdapter.setData(datas)
    }

    //    所有的数据
    val allList: ArrayList<Seller> = ArrayList()
    fun onHomeSuccess(nearbySellers: List<Seller>, otherSellers: List<Seller>) {
        allList.clear()
        allList.addAll(nearbySellers)
        allList.addAll(otherSellers)
        homeRvAdapter.setData(allList)

        //有数据可以滚动才可以监听滚动事件,设置标题的透明效果
        rvHome.setOnScrollListener(object : RecyclerView.OnScrollListener() {

            override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
                if (recyclerView != null) {
                    super.onScrollStateChanged(recyclerView, newState)
                }
            }

            override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
                if (recyclerView != null) {
                    super.onScrolled(recyclerView, dx, dy)
                }
                sum += dy
                if (sum > distance) {
                    alpha = 255
                } else {
                    alpha = sum * 200 / distance
                    alpha += 55
                }
                Log.e("home", "alpha:$alpha")
                ll_title_container.setBackgroundColor(Color.argb(alpha, 0x31, 0x90, 0xe8))
            }
        })
    }

    fun onHomeFailed() {
        toast("onHomeFailed")
    }

}

HomeFragmentPresenster.kt负责数据的请求,onHomeSuccess和onHomeFailed分别处理正常和异常的数据情形并返回到fragment来刷新界面

package com.example.takeout.presenter

import android.util.Log
import com.example.takeout.model.net.ResponseInfo
import com.example.takeout.model.net.TakeoutService
import com.example.takeout.ui.fragment.HomeFragment
import com.heima.takeout.model.beans.Seller
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory


class HomeFragmentPresenster(val homeFragment: HomeFragment) {
    val takeoutService: TakeoutService

    init {
        val retrofit = Retrofit.Builder()
//            .baseUrl("https://mrobot.pcauto.com.cn/v2/cms/")
//            .baseUrl("https://baobab.kaiyanapp.com/")
            .baseUrl("http://127.0.0.1:8090/")
            .addConverterFactory(GsonConverterFactory.create())
            .build()

        takeoutService = retrofit.create(TakeoutService::class.java)
    }

    /**
     * 使用异步获取数据
     */
    fun getHomeInfo() {
        //TOTO:要异步访问
        val homeCall = takeoutService.getHomeInfo();
        takeoutService.getHomeInfo().enqueue(object : Callback<ResponseInfo> {
            override fun onResponse(call: Call<ResponseInfo>?, response: Response<ResponseInfo>?) {
                if (response == null) {
                    Log.d("HomeFragmentPresenster", "服务器没有成功返回=====")
                } else {
                    if (response.isSuccessful()) {
                        val responseInfo = response.body()
                        val nearbySellerList: List<Seller> = responseInfo.nearbySellerList
                        val otherSellerList: List<Seller> = responseInfo.otherSellerList

                        //有数据,成功页面
                        if (nearbySellerList.isNotEmpty() || otherSellerList.isNotEmpty()) {
                            homeFragment.onHomeSuccess(nearbySellerList, otherSellerList)
                        } else {
                            //无数据,异常页面
                            homeFragment.onHomeFailed()
                        }
                    }
                }
            }

            override fun onFailure(call: Call<ResponseInfo>?, t: Throwable?) {
                //失败
                Log.d("HomeFragmentPresenster", "onFailure=====" + t.toString())
            }
        })
    }
}

HomeRvAdapter.kt负责adapter每一个条目的刷新,这里对于大list条目只是设置了一个TextView

package com.example.takeout.ui.adapter

import android.content.Context
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.daimajia.slider.library.SliderLayout
import com.daimajia.slider.library.SliderTypes.TextSliderView
import com.example.takeout.R
import com.heima.takeout.model.beans.Seller
import org.jetbrains.anko.find

class HomeRvAdapter(val context: Context) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {

    //定义常量
    companion object {
        val TYPE_TITLE = 0
        val TYPE_SELLER = 1
    }

    var mDatas: ArrayList<Seller> = ArrayList()

    fun setData(data: ArrayList<Seller>) {
        this.mDatas = data
        notifyDataSetChanged()
    }

    /**
     * 不同position对应不同类型
     */
    override fun getItemViewType(position: Int): Int {
        if (position == 0) {
            return TYPE_TITLE
        } else {
            return TYPE_SELLER
        }
    }

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        val viewType = getItemViewType(position)
        when (viewType) {
            TYPE_TITLE -> (holder as TitleHolder).bindData("我是title----------------------------------------")
            TYPE_SELLER -> (holder as SellerHolder).bindData(mDatas[position - 1])
        }

    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        when (viewType) {
            TYPE_TITLE -> return TitleHolder(View.inflate(context, R.layout.item_title, null))
            TYPE_SELLER -> return SellerHolder(View.inflate(context, R.layout.item_seller, null))
            else -> return TitleHolder(View.inflate(context, R.layout.item_home_common, null))
        }
    }

    override fun getItemCount(): Int {
        if (mDatas.size > 0) {
            return mDatas.size + 1
        } else {
            return 0
        }
    }

    //内部类,商家的holder
    inner class SellerHolder(item: View) : RecyclerView.ViewHolder(item) {
        val tvTitle: TextView

        init {
            tvTitle = item.find(R.id.tv_title)
        }

        fun bindData(seller: Seller) {
            tvTitle.text = seller.name
        }
    }

    //存放图片的url和名称
    var url_maps: HashMap<String, Int> = HashMap()

    //内部类,title的holder
    inner class TitleHolder(item: View) : RecyclerView.ViewHolder(item) {

        val sliderLayout: SliderLayout

        init {
            sliderLayout = item.findViewById(R.id.slider)
        }

        fun bindData(data: String) {
            if (url_maps.size == 0) {
                url_maps.put("Hannibal", R.mipmap.pic1);
                url_maps.put("Big Bang Theory", R.mipmap.pic2);
                url_maps.put("House of Cards", R.mipmap.pic3);
                url_maps.put("Game of Thrones", R.mipmap.pic4);
                for ((key, value) in url_maps) {
                    val textSlideView: TextSliderView = TextSliderView(context)
                    textSlideView.description(key).image(value)
                    sliderLayout.addSlider(textSlideView)
                }

            }
        }
    }
}

TakeoutService.kt是Retrofit请求的service

package com.example.takeout.model.net

import retrofit2.Call
import retrofit2.http.GET

interface TakeoutService {

//ex.    @GET("users/{user}/repos")
//ex.    fun listRepos(@Path("user") user: String): Call<List<Repo>>

    @GET("takeout?index=0")
    fun getHomeInfo(): Call<ResponseInfo>

}

ResponseInfo.kt服务器返回的数据,这里2种数据都是list类型的数据

package com.example.takeout.model.net

import com.heima.takeout.model.beans.Seller

class ResponseInfo {
    //服务器开发者定义的数据结构
    var code: String = ""
    lateinit var nearbySellerList:List<Seller>
    lateinit var otherSellerList:List<Seller>
}

Seller.kt数据的bean对象

package com.heima.takeout.model.beans

import android.content.pm.ActivityInfo
import java.io.Serializable
import java.util.*

data class Seller(var id: Long, var pic: String, var name: String, var score: String, var sale: String,
                  var ensure: String, var invoice: String, var sendPrice: String, var deliveryFee: String,
                  var recentVisit: String, var distance: String, var time: String, var icon: String,
                  var activityList: ArrayList<ActivityInfo>) : Serializable{

//    var id: Long = 0
//    var pic: String? = null
//    var name: String? = null
//
//    var score: String? = null
//    var sale: String? = null
//    var ensure: String? = null
//
//    var invoice: String? = null
//    var sendPrice: String? = null
//    var deliveryFee: String? = null
//
//    var recentVisit: String? = null
//    var distance: String? = null
//    var time: String? = null
//
//    var icon: String? = null
//
//    var activityList: ArrayList<ActivityInfo>? = null

}

Json数据takeInfors

{
	"nearbySellerList": [
		{
			"activityList": "",
			"deliveryFee": "6",
			"distance": "996米/50分钟",
			"ensure": "takeout/imgs/seller/3.jpg",
			"id": 1,
			"invoice": " ",
			"name": "其他第1家分店",
			"pic": "",
			"recentVisit": "",
			"sale": "月售8份",
			"score": "4",
			"sendPrice": "30",
			"time": ""
		},
		{
			"activityList": "",
			"deliveryFee": "6",
			"distance": "996米/50分钟",
			"ensure": "takeout/imgs/seller/3.jpg",
			"id": 2,
			"invoice": " ",
			"name": "其他第2家分店",
			"pic": "",
			"recentVisit": "",
			"sale": "月售8份",
			"score": "4",
			"sendPrice": "30",
			"time": ""
		},
		{
			"activityList": "",
			"deliveryFee": "6",
			"distance": "996米/50分钟",
			"ensure": "takeout/imgs/seller/3.jpg",
			"id": 3,
			"invoice": " ",
			"name": "其他第3家分店",
			"pic": "",
			"recentVisit": "",
			"sale": "月售8份",
			"score": "4",
			"sendPrice": "30",
			"time": ""
		},
		{
			"activityList": "",
			"deliveryFee": "6",
			"distance": "996米/50分钟",
			"ensure": "takeout/imgs/seller/3.jpg",
			"id": 4,
			"invoice": " ",
			"name": "其他第4家分店",
			"pic": "",
			"recentVisit": "",
			"sale": "月售8份",
			"score": "4",
			"sendPrice": "30",
			"time": ""
		},
		{
			"activityList": "",
			"deliveryFee": "6",
			"distance": "996米/50分钟",
			"ensure": "takeout/imgs/seller/3.jpg",
			"id": 5,
			"invoice": " ",
			"name": "其他第5家分店",
			"pic": "",
			"recentVisit": "",
			"sale": "月售8份",
			"score": "4",
			"sendPrice": "30",
			"time": ""
		},
		{
			"activityList": "",
			"deliveryFee": "6",
			"distance": "996米/50分钟",
			"ensure": "takeout/imgs/seller/3.jpg",
			"id": 6,
			"invoice": " ",
			"name": "其他第6家分店",
			"pic": "",
			"recentVisit": "",
			"sale": "月售8份",
			"score": "4",
			"sendPrice": "30",
			"time": ""
		},
		{
			"activityList": "",
			"deliveryFee": "6",
			"distance": "996米/50分钟",
			"ensure": "takeout/imgs/seller/3.jpg",
			"id": 7,
			"invoice": " ",
			"name": "其他第7家分店",
			"pic": "",
			"recentVisit": "",
			"sale": "月售8份",
			"score": "4",
			"sendPrice": "30",
			"time": ""
		},
		{
			"activityList": "",
			"deliveryFee": "6",
			"distance": "996米/50分钟",
			"ensure": "takeout/imgs/seller/3.jpg",
			"id": 8,
			"invoice": " ",
			"name": "其他第8家分店",
			"pic": "",
			"recentVisit": "",
			"sale": "月售8份",
			"score": "4",
			"sendPrice": "30",
			"time": ""
		},
		{
			"activityList": "",
			"deliveryFee": "6",
			"distance": "996米/50分钟",
			"ensure": "takeout/imgs/seller/3.jpg",
			"id": 9,
			"invoice": " ",
			"name": "其他第9家分店",
			"pic": "",
			"recentVisit": "",
			"sale": "月售8份",
			"score": "4",
			"sendPrice": "30",
			"time": ""
		},
		{
			"activityList": "",
			"deliveryFee": "6",
			"distance": "996米/50分钟",
			"ensure": "takeout/imgs/seller/3.jpg",
			"id": 10,
			"invoice": " ",
			"name": "其他第10家分店",
			"pic": "",
			"recentVisit": "",
			"sale": "月售8份",
			"score": "4",
			"sendPrice": "30",
			"time": ""
		},
		{
			"activityList": "",
			"deliveryFee": "6",
			"distance": "996米/50分钟",
			"ensure": "takeout/imgs/seller/3.jpg",
			"id": 11,
			"invoice": " ",
			"name": "其他第11家分店",
			"pic": "",
			"recentVisit": "",
			"sale": "月售8份",
			"score": "4",
			"sendPrice": "30",
			"time": ""
		},
		{
			"activityList": "",
			"deliveryFee": "6",
			"distance": "996米/50分钟",
			"ensure": "takeout/imgs/seller/3.jpg",
			"id": 12,
			"invoice": " ",
			"name": "其他第12家分店",
			"pic": "",
			"recentVisit": "",
			"sale": "月售8份",
			"score": "4",
			"sendPrice": "30",
			"time": ""
		},
		{
			"activityList": "",
			"deliveryFee": "6",
			"distance": "996米/50分钟",
			"ensure": "takeout/imgs/seller/3.jpg",
			"id": 13,
			"invoice": " ",
			"name": "其他第13家分店",
			"pic": "",
			"recentVisit": "",
			"sale": "月售8份",
			"score": "4",
			"sendPrice": "30",
			"time": ""
		}
	],
	"otherSellerList": [
		{
			"activityList": "",
			"deliveryFee": "6",
			"distance": "996米/50分钟",
			"ensure": "takeout/imgs/seller/3.jpg",
			"id": 1,
			"invoice": " ",
			"name": "other1家分店",
			"pic": "",
			"recentVisit": "",
			"sale": "月售8份",
			"score": "4",
			"sendPrice": "30",
			"time": ""
		},
		{
			"activityList": "",
			"deliveryFee": "6",
			"distance": "996米/50分钟",
			"ensure": "takeout/imgs/seller/3.jpg",
			"id": 2,
			"invoice": " ",
			"name": "other2家分店",
			"pic": "",
			"recentVisit": "",
			"sale": "月售8份",
			"score": "4",
			"sendPrice": "30",
			"time": ""
		},
		{
			"activityList": "",
			"deliveryFee": "6",
			"distance": "996米/50分钟",
			"ensure": "takeout/imgs/seller/3.jpg",
			"id": 3,
			"invoice": " ",
			"name": "other3家分店",
			"pic": "",
			"recentVisit": "",
			"sale": "月售8份",
			"score": "4",
			"sendPrice": "30",
			"time": ""
		},
		{
			"activityList": "",
			"deliveryFee": "6",
			"distance": "996米/50分钟",
			"ensure": "takeout/imgs/seller/3.jpg",
			"id": 4,
			"invoice": " ",
			"name": "other4家分店",
			"pic": "",
			"recentVisit": "",
			"sale": "月售8份",
			"score": "4",
			"sendPrice": "30",
			"time": ""
		},
		{
			"activityList": "",
			"deliveryFee": "6",
			"distance": "996米/50分钟",
			"ensure": "takeout/imgs/seller/3.jpg",
			"id": 5,
			"invoice": " ",
			"name": "other5家分店",
			"pic": "",
			"recentVisit": "",
			"sale": "月售8份",
			"score": "4",
			"sendPrice": "30",
			"time": ""
		},
		{
			"activityList": "",
			"deliveryFee": "6",
			"distance": "996米/50分钟",
			"ensure": "takeout/imgs/seller/3.jpg",
			"id": 6,
			"invoice": " ",
			"name": "other6家分店",
			"pic": "",
			"recentVisit": "",
			"sale": "月售8份",
			"score": "4",
			"sendPrice": "30",
			"time": ""
		},
		{
			"activityList": "",
			"deliveryFee": "6",
			"distance": "996米/50分钟",
			"ensure": "takeout/imgs/seller/3.jpg",
			"id": 7,
			"invoice": " ",
			"name": "other7家分店",
			"pic": "",
			"recentVisit": "",
			"sale": "月售8份",
			"score": "4",
			"sendPrice": "30",
			"time": ""
		},
		{
			"activityList": "",
			"deliveryFee": "6",
			"distance": "996米/50分钟",
			"ensure": "takeout/imgs/seller/3.jpg",
			"id": 8,
			"invoice": " ",
			"name": "other8家分店",
			"pic": "",
			"recentVisit": "",
			"sale": "月售8份",
			"score": "4",
			"sendPrice": "30",
			"time": ""
		},
		{
			"activityList": "",
			"deliveryFee": "6",
			"distance": "996米/50分钟",
			"ensure": "takeout/imgs/seller/3.jpg",
			"id": 9,
			"invoice": " ",
			"name": "other9家分店",
			"pic": "",
			"recentVisit": "",
			"sale": "月售8份",
			"score": "4",
			"sendPrice": "30",
			"time": ""
		},
		{
			"activityList": "",
			"deliveryFee": "6",
			"distance": "996米/50分钟",
			"ensure": "takeout/imgs/seller/3.jpg",
			"id": 10,
			"invoice": " ",
			"name": "other10家分店",
			"pic": "",
			"recentVisit": "",
			"sale": "月售8份",
			"score": "4",
			"sendPrice": "30",
			"time": ""
		},
		{
			"activityList": "",
			"deliveryFee": "6",
			"distance": "996米/50分钟",
			"ensure": "takeout/imgs/seller/3.jpg",
			"id": 11,
			"invoice": " ",
			"name": "other11家分店",
			"pic": "",
			"recentVisit": "",
			"sale": "月售8份",
			"score": "4",
			"sendPrice": "30",
			"time": ""
		},
		{
			"activityList": "",
			"deliveryFee": "6",
			"distance": "996米/50分钟",
			"ensure": "takeout/imgs/seller/3.jpg",
			"id": 12,
			"invoice": " ",
			"name": "other12家分店",
			"pic": "",
			"recentVisit": "",
			"sale": "月售8份",
			"score": "4",
			"sendPrice": "30",
			"time": ""
		},
		{
			"activityList": "",
			"deliveryFee": "6",
			"distance": "996米/50分钟",
			"ensure": "takeout/imgs/seller/3.jpg",
			"id": 13,
			"invoice": " ",
			"name": "other13家分店",
			"pic": "",
			"recentVisit": "",
			"sale": "月售8份",
			"score": "4",
			"sendPrice": "30",
			"time": ""
		}
	]
}

效果如下:

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值