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' 

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐