之前个google定义kotlin为Android一级语言,小弟之前对kotlin也并不是很了解所以去了解之后写了一份有关kotlin版的RecyclerView希望对新学习kotlin的人有一些帮助。
在使用kotlin之前我们要对在As中下载kotlin的插件在重启As之后新建一个Android项目在As的code栏最下面有一个convert Java file to kotlin file 转换之后再Activity会有一个config的设置,它会帮你设置完kotlin在module的build.gradle和全局build.gradle中设置kotlin的一系列配置
我们来看看我们的MainActivity页面的操作
package com.example.liuqiang.kotlinforandroid
import android.app.Activity
import android.content.Context
import android.os.Bundle
import android.os.Handler
import android.os.Message
import android.support.v7.widget.LinearLayoutManager
import android.support.v7.widget.RecyclerView
import android.util.Log
import android.view.View
import android.widget.Button
import android.widget.Toast
import com.google.gson.*
import com.google.gson.reflect.TypeToken
import okhttp3.*
import java.io.IOException
class MainActivity : Activity() {
//创建变量此处使用的网络访问是基于okhttp的
var mOkHttpClient: OkHttpClient? = null
var request: Request? = null;
var body: FormBody? = null;
var btn_back: Button? = null;
val context: Context = this
var recyclerView: RecyclerView? = null;
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//加载数据
loadData()
//初始化控件和绑定事件
btn_back = findViewById(R.id.btn_back) as Button;
recyclerView = findViewById(R.id.recyclerView) as RecyclerView;
btn_back!!.setOnClickListener {
finish()
}
}
fun loadData() {
val path = "您的接口地址"
//kotlin不需要new 可直接写
mOkHttpClient = OkHttpClient()
//对应参数
body = FormBody.Builder()
.addEncoded("key", "val")
.build()
request = Request.Builder().url(path).post(body).build()
//此处是重写callback类也可以自己定义一个class类实现Callback
mOkHttpClient!!.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call?, e: IOException?) {
}
override fun onResponse(call: Call?, response: Response?) {
if (response != null) {
if (response.isSuccessful) {
//拿到服务器返回参数
var response = response.body().string();
Log.d("###",response);
try {
//使用Gson解析返回数据
var gson: Gson = Gson()
var json: JsonParser= JsonParser();
var jent: JsonElement=json.parse(response) as JsonElement;
var job:JsonObject = jent.asJsonObject;
var jar: JsonArray;
jar = job.getAsJsonArray("rows");
//拿到gson类解析tyep
val turnsType = object : TypeToken<ArrayList<TestInfo>>() {}.type
val list: ArrayList<TestInfo>;
//完成解析
list = gson.fromJson<ArrayList<TestInfo>>(jar, turnsType);
//通知recyclerView
var message = Message();
message.obj = list;
hand.sendMessage(message);
} catch(e: Exception) {
println(e.message);
}
}
}
}
});
}
//完成recyclerView适配
var hand = object : Handler() {
override fun handleMessage(msg: Message?) {
super.handleMessage(msg)
val list: ArrayList<TestInfo>;
list = msg!!.obj as ArrayList<TestInfo>
recyclerView!!.layoutManager = LinearLayoutManager(context);
recyclerView!!.adapter = TestAdapter(list, context,itemClick());
}
}
//inner关键字可以方位外部类的参数
//次类是处理recyclerView的点击事件的
inner class itemClick: ItemClick{
override fun OnItemClick(v: View, position: Int) {
Toast.makeText(context,"你点击了第"+(position+1)+"个",Toast.LENGTH_LONG).show();
}
}
}
在adapter里面我们绑定了item点击接口的处理
package com.example.liuqiang.kotlinforandroid
import android.content.Context
import android.support.v7.widget.RecyclerView
import android.support.v7.widget.RecyclerView.Adapter
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import android.widget.Toast
import com.bumptech.glide.Glide
import com.example.liuqiang.kotlinforandroid.TestAdapter.MyHolder
import java.io.File
class TestAdapter : Adapter<MyHolder> {
//定义参数
var list: List<TestInfo>? = null;
var contxt: Context? = null;
//获得事件回调接口
var item:ItemClick?=null;
//初始化数据
constructor(list: ArrayList<TestInfo>, contxt: Context,item:ItemClick) {
this.list = list;
this.contxt = contxt;
this.item=item;
}
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): MyHolder {
//得到itemView
var v: View = LayoutInflater.from(contxt).inflate(R.layout.item, null, false);
var holder = MyHolder(v);
//为itemView绑定点击事件
v.setOnClickListener(onClick());
return holder;
}
override fun getItemCount(): Int {
var size = list!!.size
return size;
}
override fun onBindViewHolder(holder: MyHolder?, position: Int) {
var name = list!!.get(position).username;
holder!!.txtName.setText(name);
var dept = list!!.get(position).deptname;
var path = "您的图片地址;
if(path.contains(".jpg")||path.contains(".png")){
Glide.with(contxt)
.load(path)
.thumbnail(0.1f)//使用原图的10/1作为略缩图
.into(holder.image_head);
}else{
holder.image_head.setImageResource(R.drawable.mv);
}
//得到position防止滑动点击错位
holder.itemView.setTag(position);
holder.bonus.setText(dept);
}
//viewHolder
public class MyHolder(itemView: View?) : RecyclerView.ViewHolder(itemView) {
var image_head: ImageView = itemView!!.findViewById(R.id.image_head) as ImageView;
var txtName: TextView = itemView!!.findViewById(R.id.txtName) as TextView;
var bonus: TextView = itemView!!.findViewById(R.id.bonus) as TextView;
}
//调用接口回调
inner class onClick:View.OnClickListener{
override fun onClick(v: View?) {
var positon:Int= v!!.getTag() as Int;
if(item==null){
Toast.makeText(contxt,"哈哈哈",Toast.LENGTH_LONG).show();
}
item!!.OnItemClick(v,positon);
}
}
}
itemView点击处理接口
package com.example.liuqiang.kotlinforandroid
import android.view.View
/**
* Created by liuqiang on 2017/5/23.
*/
interface ItemClick {
fun OnItemClick(v: View,position:Int);
}
实体类
package com.example.liuqiang.kotlinforandroid
import java.io.Serializable
/**
* Created by liuqiang on 2017/5/21.
*/
//data 是数据类的关键字 默认给字段配置get和set方法
data class TestInfo(var username:String, var fileContent:String,var deptname:String): Serializable{
}
最后的utils类
package com.example.liuqiang.kotlinforandroid
import android.app.ProgressDialog
import android.content.Context
/**
* Created by liuqiang on 2017/5/21.
*/
class Utils {
var dialog:ProgressDialog?=null;
fun showProgressDialog(context:Context,message:String,isFouse:Boolean){
if(dialog==null){
dialog=ProgressDialog(context);
}
dialog!!.setMessage(message);
dialog!!.setCancelable(isFouse);
dialog!!.setCanceledOnTouchOutside(isFouse);
dialog!!.show();
}
fun cancelProgressDialog(){
if(dialog!=null){
dialog!!.dismiss();
dialog=null;
}
}
}