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

it2023-12-22  61

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)