Koltin21.Takeout首页Retrofit请求数据(7)

本文介绍了一个基于MVP模式实现的HomeFragment组件,详细展示了如何通过Kotlin语言进行界面布局、数据处理及网络请求等操作,并实现了数据加载与列表滚动时的UI变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HomeFragment.kt使用mvp的结构,fragment作为V

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 kotlinx.android.synthetic.main.fragment_home.*
import org.jetbrains.anko.find

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<String> = ArrayList<String>()
    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)
        //有数据可以滚动才可以监听滚动事件,设置标题的透明效果
        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 onHomeSuccess() {

    }

    fun onHomeFailed() {

    }

}

HomeFragmentPresenster.kt presenter展示层,处理相关的业务逻辑

package com.example.takeout.presenter

import android.util.Log
import com.example.takeout.model.net.TakeoutService
import com.example.takeout.ui.fragment.HomeFragment
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.heima.takeout.model.beans.Seller
import com.heima.takeout.model.net.ResponseInfo
import org.json.JSONObject
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("http://localhost:8080/")
            .addConverterFactory(GsonConverterFactory.create())
            .build()

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

    /**
     * 使用异步获取数据
     */
    fun getHomeInfo() {
        //TOTO:要异步访问
        val homeCall = takeoutService.getHomeInfo();
        homeCall.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()
                        if (responseInfo.code.equals("0")) {
                            val json = responseInfo.data
                            parserJson(json)
                        } else if (responseInfo.code.equals("-1")) {
                            //返回值和接口文档约定

                        }
                    } else {
                        Log.d("HomeFragmentPresenster", "服务器代码错误=====")
                    }
                }
            }


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

        //有数据,成功页面
        homeFragment.onHomeSuccess()

        //无数据,异常页面
        homeFragment.onHomeFailed()
    }

    /**
     * 解析数据
     */
    private fun parserJson(json: String?) {
        //解析数据
        val gson = Gson()
        var jsonObject = JSONObject(json)
        //附近的商家
        var nearby = jsonObject.getString("nearbySellerList")
        val nearbySellers: List<Seller> =
            gson.fromJson(nearby, object : TypeToken<List<Seller>>() {}.type)
        //其他的商家
        val other = jsonObject.getString("otherSellerList")
        val otherSellers: List<Seller> =
            gson.fromJson(other, object : TypeToken<List<Seller>>() {}.type)
        //TODO:刷新UI

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

    }
}

ResponseInfo.kt服务端定义的数据结构

package com.heima.takeout.model.net

class ResponseInfo {
    //服务器开发者定义的数据结构
    var code: String = ""
    var data: String = ""
}

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

}

TakeoutService.kt使用Retrofit的服务的请求文件

package com.example.takeout.model.net

import com.heima.takeout.model.net.ResponseInfo
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("home")
    fun getHomeInfo(): Call<ResponseInfo>

}

配置Retrofit,apt可以不需要配置

apt插件的安装:
1.在project的gradle中添加
buildscript {
  dependencies {
    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
  }
}
2.apt插件的使用
在modle的gradle中添加
apply plugin: 'com.neenbedankt.android-apt'

compile 'com.google.code.gson:gson:2.2.4'
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0' 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值