Kotlin - 一个简单的Demo项目

Java的超集 - kotlin, 真是让我爱不释手了。哈哈,不在项目里用两句,始终感觉哪里不对一样。下面我们写一个简单的示例,希望也能帮到还在学习Kotlin的朋友们。

首先还是创建kotlin项目,下面我们一步一步来:

NO.1 建立一个常规的Android项目,然后进行kotlin开发配置。
        在菜单栏找到工具选项[Tools] -> Kotlin -> Config Kotlin In Your Project. 然后会出来一个Gradle和Android Gradle的选项,选择Gradle就行了。现在最新的Kotlin版本应该是1.1.1

Kotlin - 一个简单的Demo项目_第1张图片
QQ截图20170413163007.png

根据你的需要,选择为所有模块都加上kotlin支持还是只针对其中的一个模块。按下OK键以后,使用Gradle刷新项目。随即可以编写Kotlin代码。然后你就能在项目管理器创建Kotlin的文件或者类等。

Kotlin - 一个简单的Demo项目_第2张图片
QQ截图20170413163007.png

那我们现在开始Demo项目的开发吧!首先简单描述一下,我们要使用Retrofit、Picasso和SwipeRefresh控件开发这样一个列表应用,我们暂时叫它Demo吧!
先看例图:


Kotlin - 一个简单的Demo项目_第3张图片
155900_89149e62_386852 (1).jpeg

HttpApi.kt 从网络上获取数据

package com.yuge.xiaohua.api

import com.yuge.xiaohua.model.JokeInfoEntry
import com.yuge.xiaohua.model.ResultInfoEntry
import retrofit.Call
import retrofit.http.GET
import retrofit.http.Query

/**
 * Created by Mrper on 15-12-13.
 */
interface HttpApi {
//通过接口从网络上获取数据
    @GET("biz/bizserver/xiaohua/list.do")
    fun getJokes(@Query("size") size: Int, @Query("page") page: Int): Call>>

}

ApiManager.kt 网络请求类

package com.yuge.xiaohua.api

import com.squareup.okhttp.OkHttpClient

import retrofit.GsonConverterFactory
import retrofit.Retrofit

/**
 * Created by Mrper on 15-12-12.
 */
class ApiManager private constructor() {

    private val httpApi: HttpApi

    init {
        val okHttpClient = OkHttpClient()
        val retrofit = Retrofit.Builder().baseUrl(BaseUrl).client(okHttpClient).addConverterFactory(GsonConverterFactory.create()).build()
        httpApi = retrofit.create(HttpApi::class.java)
    }

    companion object {

        val BaseUrl = "http://api.1-blog.com/"

        private var apiManager: ApiManager? = null

        fun getHttpApi(): HttpApi {
            if (apiManager == null)
                apiManager = ApiManager()
            return apiManager!!.httpApi
        }
    }

}

JokeInfoEntry.kt 实体类,Data-Class, 比Java定义简单多了,哈哈,还自带构造函数

package com.yuge.xiaohua.model

data class JokeInfoEntry (
    var picUrl: String? = null,
    var xhid: String? = null,
    var author: String? = null,
    var id: Int = 0,
    var content: String? = null,
    var status: String? = null
)

网络请求返回的结果实体类

package com.yuge.xiaohua.model

/**
 * Created by Mrper on 15-12-12.
 */
data class ResultInfoEntry(
    var status :String? = null,
    var desc :String? = null,
    var detail: T? = null
)

JokeAdapter类,可以使用我们那TemplateAdapter或者BasicAdapter来代替 Kotlin - 贡献两个Android的Adapter类,结合DataBinding和常规的Adapter

package com.yuge.xiaohua.adapter

import android.content.Context
import android.text.TextUtils
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import android.widget.ImageView
import android.widget.TextView
import com.squareup.picasso.Picasso
import com.yuge.xiaohua.R
import com.yuge.xiaohua.model.JokeInfoEntry

/**
 * Created by Mrper on 15-12-14.
 */
class JokeAdapter(ctx: Context?, jokes: Collection?) : BaseAdapter(){

    private var ctx: Context? = null
    private var jokes : Collection? = null

    init{
        this.ctx = ctx;
        this.jokes = jokes;
    }

    override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View? {
        var item : JokeInfoEntry? = this.jokes!!.elementAt(position);
        var holder : ViewHolder? = null
        var convertView = convertView
        if(convertView == null){
            holder = ViewHolder()
            convertView = View.inflate(ctx, R.layout.listitem_joke,null)
            holder.txtJoke = convertView.findViewById(R.id.txtJoke) as TextView
            holder.imgJoke = convertView.findViewById(R.id.imgJoke) as ImageView
            convertView.tag = holder
        }else{
            holder = convertView.tag as ViewHolder
        }
        holder.txtJoke!!.text = item!!.content
        if(!TextUtils.isEmpty(item.picUrl))
            Picasso.with(ctx).load(item.picUrl).into(holder.imgJoke)
        else
            holder.imgJoke!!.setImageBitmap(null)
        return convertView;
    }

    override fun getItem(position: Int): Any? {
        return jokes!!.elementAt(position)
    }

    override fun getItemId(position: Int): Long {
        return position.toLong()
    }

    override fun getCount(): Int {
        return this.jokes!!.size
    }

    data class  ViewHolder(var txtJoke: TextView?=null,var imgJoke: ImageView?=null)

}

最后开始我们的Activity编写, 页面编写,那就大功告成咯

package com.yuge.xiaohua

import android.graphics.Color
import android.os.Bundle
import android.support.v4.widget.SwipeRefreshLayout
import android.support.v7.app.AppCompatActivity
import android.widget.AbsListView
import android.widget.ListView
import android.widget.Toast
import com.yuge.xiaohua.adapter.JokeAdapter
import com.yuge.xiaohua.api.ApiManager
import com.yuge.xiaohua.model.JokeInfoEntry
import com.yuge.xiaohua.model.ResultInfoEntry
import retrofit.Callback
import retrofit.Response
import retrofit.Retrofit
import java.util.*

class MainActivity : AppCompatActivity() {

    private var lvJoke : ListView? = null
    private var refreshContainer : SwipeRefreshLayout? = null
    private var jokes : ArrayList? = ArrayList()
    private var jokeAdapter : JokeAdapter? = null
    private var curPageIndex : Int = 0
    private var isLoading : Boolean = false

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        lvJoke = this.findViewById(R.id.lvJoke) as ListView
        refreshContainer = this.findViewById(R.id.refreshContainer) as SwipeRefreshLayout
        jokeAdapter = JokeAdapter(this@MainActivity,jokes)
        lvJoke!!.adapter = jokeAdapter;
        lvJoke!!.setOnScrollListener(object:AbsListView.OnScrollListener{
            override fun onScroll(view: AbsListView?, firstVisibleItem: Int, visibleItemCount: Int, totalItemCount: Int) { }

            override fun onScrollStateChanged(view: AbsListView?, scrollState: Int) {
                var length : Int = jokes!!.size
                if(scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE && length%10 == 0
                        && length-1 == view!!.lastVisiblePosition){
                    loadJokes(true)
                }
            }
        })
        refreshContainer!!.setColorSchemeColors(Color.BLUE)
        refreshContainer!!.setOnRefreshListener({ loadJokes(false) })
        loadJokes(false)
    }

    private fun loadJokes(isLoadMore:Boolean){
        if(!isLoading) {
            isLoading = true
            var pageIndex: Int = if (isLoadMore) curPageIndex + 1 else 0
            ApiManager.getHttpApi().getJokes(10, pageIndex).enqueue(object : Callback>> {
                override fun onResponse(response: Response>>, retrofit: Retrofit) {
                    if(refreshContainer!!.isRefreshing) refreshContainer!!.isRefreshing = false
                    if (response.isSuccess && response.body() != null) {
                        var result: ResultInfoEntry> = response.body()
                        if (result.status.equals("000000")) {
                            if ([email protected] == 0)
                                jokes!!.clear()
                            [email protected] = pageIndex
                            jokes!!.addAll(result.detail!!.toArrayList())
                            jokeAdapter!!.notifyDataSetChanged()
                            Toast.makeText(this@MainActivity, if ([email protected] == 0) "刷新完成" else "加载完成", Toast.LENGTH_LONG).show()
                        } else {
                            Toast.makeText(this@MainActivity, result!!.desc, Toast.LENGTH_SHORT).show()
                        }
                    }
                    isLoading = false
                }

                override fun onFailure(t: Throwable) {
                    if(refreshContainer!!.isRefreshing) refreshContainer!!.isRefreshing = false
                    Toast.makeText(this@MainActivity, "网络错误,请稍候重试", Toast.LENGTH_SHORT).show()
                    isLoading = false
                }
            })
        }
    }

}

最后贴一下项目地址: XiaoHua. 谢谢围观,不懂的请联系本人QQ407158004

你可能感兴趣的:(Kotlin - 一个简单的Demo项目)