学习的步伐(二)Kotlin 实现Recyclerview列表(补充:tab选项卡+CoordinatorLayout收缩布局+复杂Recyclerview列表)
2017-06-24 09:38
639 查看
一日之计在于晨,来一发!
学习的步伐(五) Kotlin 基础语法学习总结:语法
学习的步伐(四) Kotlin 基础语法学习总结:操作符
学习的步伐(三)Kotlin TabLayout+Viewpager+Fragment实现基础框架
demo早就写好了,但是时间久了还是会忘的。还是要经常复习的,不是有个记忆曲线吗,所以本文是我复习用的,俗话说好记性不如烂笔头吗!
project的build.gradle
var 和val
? 表示可以为空
!! 第三个选择是 NPE-lovers。我们可以用 b!! ,这会返回一个非空的 b 或者抛出一个 b 为空的 NPE
: : 利用反射
函数 返回一个Arraylist集合
for循环
Log打印和Toast
注意:
设置列表的样式和适配器
getData():
适配器的编写
传参
KotlinRecAdapter
ViewHolder也有多种写法:
重写Recyclerview的适配器里的方法:
item点击事件的自定义接口
奉上适配器的整体代码:
到这里整个功能就实现了!
补充功能:效果图
demo源码 tab选项卡+CoordinatorLayout收缩布局+复杂Recyclerview列表
学习的步伐(六) Kotlin 学习总结:类的特性学习的步伐(五) Kotlin 基础语法学习总结:语法
学习的步伐(四) Kotlin 基础语法学习总结:操作符
学习的步伐(三)Kotlin TabLayout+Viewpager+Fragment实现基础框架
概述
本文主要kotlin实现一个recyclerview列表,item的点击事件。demo早就写好了,但是时间久了还是会忘的。还是要经常复习的,不是有个记忆曲线吗,所以本文是我复习用的,俗话说好记性不如烂笔头吗!
配置
app的build.gradleapply plugin: 'kotlin-android' apply plugin:'kotlin-android-extensions' apply plugin: 'android-apt' compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" compile 'org.jetbrains.anko:anko:0.10.0'
project的build.gradle
buildscript { ext.kotlin_version = '1.1.2-5' //版本号 repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.2.2' //配置 classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } }
Kotlin 基础介绍
这里只是本文用到的基础。个人感觉学习一门新语言,还是去写一些demo或项目,是学的比较深刻的。很多东西但看语法,忘得特别快的(反正我是这样的),在特定的情景下学习是最快的,记忆最深的。var 和val
var是变量 val是常量
? 表示可以为空
但也根据具体的场景来确定它所表达的意思。 例如适配器中的: holder?.txtName?.text=list.get(position) 就像上面所说的?标识可以为空,但是这里的意思确实空检测,可以更安全调用(意思是不为空的情况下才会执行完这句代码,中间有一个为空就直接返回空了)
!! 第三个选择是 NPE-lovers。我们可以用 b!! ,这会返回一个非空的 b 或者抛出一个 b 为空的 NPE
//recyclerview适配器 hodler里 //这里需要从前面一个一个写 直接写itemView.调用是不行的 var txtName: TextView = itemView!!.findViewById(R.id.text_kotlin) as TextView;
: : 利用反射
//开启一个activity var intent=Intent() //:: 利用反射 intent.setClass(this,Main2Activity::class.java) startActivity(intent)
函数 返回一个Arraylist集合
/** * 制造假数据 * 返回一个ArrayList<String> 的集合 * */ fun getData( ) : ArrayList<String>{ val arrayList = ArrayList<String>() val list = listOf<String>("a", "b", "c", "d", "e", "f", "g", "h", "j", "k", "l", "m", "n", "o") //for循环 for (k in list){ arrayList.add(k) } return arrayList }
for循环
//for循环 for (k in list){ arrayList.add(k) }
Log打印和Toast
var a : Int=2//var 变量 val常量 var b : String="这是一个学习Kotlin的机会" Log.e("MainActivity","a=>>>${a}______b=>>>${b}")//Log打印 toast("a=>>>${b}")//
实现Recyclerview列表
android原生去实现大家都会写,这里只说以下kotlin实现跟android原生实现的不同。注意:
//这行代码 是帮你找到布局中所有的控件 //可以使用快捷键导入的 import kotlinx.android. 4000 synthetic.main.activity_main.*
设置列表的样式和适配器
//原生方式: linearLayoutManager = new LinearLayoutManager(getActivity()); mRec.setLayoutManager(linearLayoutManager); adapter = new OnlineRedAreaListAdapter(getActivity(), redAreaList, this); mRec.setAdapter(adapter);
//kotlin方式 val adapter = KotlinRecAdapter(this, getData()!!) recyclerview.layoutManager=LinearLayoutManager(this) recyclerview.adapter=adapter; //是不是眼前一亮的感觉 //getData()!! 表示非空
getData():
/** * 制造假数据 * 返回一个ArrayList<String> 的集合 * */ fun getData( ) : ArrayList<String>{ val arrayList = ArrayList<String>() val list = listOf<String>("a", "b", "c", "d", "e", "f", "g", "h", "j", "k", "l", "m", "n", "o","p") //for循环 for (k in list){ arrayList.add(k) } return arrayList }
适配器的编写
传参
//传数据 val adapter = KotlinRecAdapter(this, getData()!!)
KotlinRecAdapter
class KotlinRecAdapter(mCtx:Context,mList:ArrayList<String>) :RecyclerView.Adapter<KotlinRecAdapter.MHolder>(){ //可以把数据直接放到类名后面,然后用变量接收 private var context:Context = mCtx private var list:ArrayList<String> = mList
ViewHolder也有多种写法:
/** * 第一种写法 * 使用快捷键的话默认使用的是第一种 * ?表示可以为空 * !! 第三个选择是 NPE-lovers。我们可以用 b!! ,这会返回一个非空的 b 或者抛出一个 b 为空的 NPE * */ class MHolder(itemView: View?) : RecyclerView.ViewHolder(itemView) { //这里需要从前面一个一个写 直接写itemView.调用是不行的 var txtName: TextView = itemView!!.findViewById(R.id.text_kotlin) as TextView; var linearlayout: LinearLayout = itemView!!.findViewById(R.id.linearlayout) as LinearLayout; }
/** * 第二种写法 * */ class MHolder: RecyclerView.ViewHolder { constructor(view : View) : super(view){ } }
重写Recyclerview的适配器里的方法:
override fun onBindViewHolder(holder: MHolder?, position: Int) { // holder?.txtName? 都必须加个?号才可以调用 ?表示可以为空 holder?.txtName?.text=list.get(position) holder?.linearlayout?.setOnClickListener { //item点击事件 litener?.onItemClick(position) } } override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): MHolder { return MHolder(LayoutInflater.from(context).inflate(R.layout.kotlin_item,parent,false)) } override fun getItemCount(): Int { return list.size }
item点击事件的自定义接口
/** * 自定义接口处理点击事件 * 跟java的写法基本一致 * */ interface OnItemClickLitener { fun onItemClick(position : Int) } var litener:OnItemClickLitener? =null fun setOniteClickListener(litener : OnItemClickLitener ){ this.litener=litener }
奉上适配器的整体代码:
class KotlinRecAdapter(mCtx:Context,mList:ArrayList<String>) :RecyclerView.Adapter<KotlinRecAdapter.MHolder>(){ //可以把数据直接放到类名后面,然后用变量接收 private var context:Context = mCtx private var list:ArrayList<String> = mList
override fun onBindViewHolder(holder: MHolder?, position: Int) {
// holder?.txtName? 都必须加个?号才可以调用 ?表示可以为空
holder?.txtName?.text=list.get(position)
holder?.linearlayout?.setOnClickListener {
litener?.onItemClick(position)
}
}
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): MHolder {
return MHolder(LayoutInflater.from(context).inflate(R.layout.kotlin_item,parent,false))
}
override fun getItemCount(): Int {
return list.size
}
/**
* 第一种写法
* 使用快捷键的话默认使用的是第一种
* ?表示可以为空
* !! 第三个选择是 NPE-lovers。我们可以用 b!! ,这会返回一个非空的 b 或者抛出一个 b 为空的 NPE
* */
class MHolder(itemView: View?) : RecyclerView.ViewHolder(itemView) {
//这里需要从前面一个一个写 直接写itemView.调用是不行的
var txtName: TextView = itemView!!.findViewById(R.id.text_kotlin) as TextView;
var linearlayout: LinearLayout = itemView!!.findViewById(R.id.linearlayout) as LinearLayout;
}
/**
* 第二种写法
* */
//class MHolder: RecyclerView.ViewHolder {
// constructor(view : View) : super(view){
//
// }
// }
/**
* 自定义接口处理点击事件
* 跟java的写法基本一致
* */
interface OnItemClickLitener {
fun onItemClick(position : Int)
}
var litener:OnItemClickLitener? =null
fun setOniteClickListener(litener : OnItemClickLitener ){
this.litener=litener
}
}
activity实现接口的方式也变了
class MainActivity : AppCompatActivity() ,KotlinRecAdapter.OnItemClickLitener{ override fun onItemClick(position: Int) { }
intent传递数据
//跟java 类似,只是开启activity的方式变了 var intent=Intent() //:: 利用反射 intent.setClass(this,Main2Activity::class.java) intent.putExtra("position",""+position) startActivity(intent)
到这里整个功能就实现了!
demo下载地址
每天学习那么一点,积少成多。总会有回报的,俗话说的话,滴水穿石!相关文章推荐
- 不一样的RecyclerView优雅实现复杂列表布局(一)
- RecyclerView下拉刷新、上拉加载更多以及复杂列表布局的实现
- 复杂布局SwipeRefreshLayout+TabLayout+NestedScrollView+RecyclerView冲突
- CollapsingToolbarLayout配合CoordinatorLayout、AppBarLayout,RecyclerView实现伸缩布局
- RecyclerView GridLayoutManager实现复杂的列数变化的布局
- 不一样的RecyclerView优雅实现复杂列表布局(二)
- android学习-----使用TabLayout实现Tab选项卡以及遇到的一些问题(二)
- RecyclerView+SwipeRefreshLayout实现下拉刷新列表
- 采用SwipeFreshLayout+Recyclerview实现下拉刷新和上拉加载更多以及CoordinatorLayout的引入
- Android-UI布局---RecyclerView学习(三)匹配LinearLayoutManager的ItemDecoration
- Android开发之CoordinatorLayoutAppBarLayoutViewPagerTabLayout实现顶部伸缩效果
- RecyclerView实现复杂首页(条目)布局
- 【框架】CoordinatorLayout&RecyclerView 协调者布局+卡片布局
- CoordinatorLayout +RecyclerView+加载不同布局的item
- Recyclerview根据setSpanSizeLookup实现复杂布局(不用嵌套)
- Recycleview实现复杂页面 三种以上布局 瀑布流 多布局 scrollview嵌套recyclerView 显示不全 滑动冲突 之进阶终极篇
- MaterialDesign学习笔记2:TabLayout+ViewPaper实现滑动切换
- RecyclerView学习(四)----城市导航列表的实现(上)
- CoordinatorLayout +RecyclerView+加载不同布局的item
- Design之CoordinatorLayout+TabLayout+RecyclerView&CollapsingToolbarLayout