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": ""
}
]
}
效果如下: