kotlin实现一个Recyclerview与java的比较
2017-07-21 15:31
447 查看
最近在学习kotlin,本来想把之前的Recyclerview项目直接转为kotlin,但是一顿转换后发现那个Fragment的界面没有加载出来,看来还需要在学习学习。下面让我们看看java实现Recyclerview与kotlin实现Recyclerview有什么不同之处吧。
就以之前的 http://blog.csdn.net/ljwztn/article/details/71209543 这篇文章作为对照
先看看开头的类的声明
在 java 中
我们用public来表示这个类是公共的 extends表示它继承了一个BaseActivity,而在kotlin中
省去了public,并且‘extends’被 ‘: ’所代替,
接下来再看看变量的声明 java中:
而在kotlin中:
可以看到local的变量在kotlin中用internal 声明,而private的则在两者中相同,比较大的区别在于在java中我们先声明变量的类型在给他命名,而在kotlin中则相反,并且名称与类型中间有个‘:’,在java中我们可以不给变量初始值,而在kotlin中则不可以,如果这个变量之后才有赋值,需要添加lateinit,如:
并且在kotlin中声明一个常量也很简单,直接以 val 就可以
再来看看构造方法有哪些不同:
java:
kotlin:
我们发现 void 被 fun 代替了 ,static的方法则被放在了一个companion object {}的模块下,并且LinkageRecyclerViewActivity.class转换为了LinkageRecyclerViewActivity::class.java.
接下来我们看看adapter中有何不同:
java中我们写了一个
用来实现 Recyclerview 的点击事件,在kotlin中,我们直接用lambda表达式实现这个过程
在java的holder中我们对类的初始化比较简单:
而在kotlin中我们直接添加了这个adapter作为参数:
java中添加监听:
kotlin中添加监听:
可以看到kotlin中代码有着大幅度的简化
而在Activity的的实现 java:
kotlint :
总的来说 kotlin 在语法上面和 java 还是有着一些不同,而且一些 java 转换由于 kotlin 赋值不能为空的问题也会有很多需要注意的地方,我那个懒加载现在还没转明白,还需要在仔细了解了解,希望本篇文章能对大家有帮助。
就以之前的 http://blog.csdn.net/ljwztn/article/details/71209543 这篇文章作为对照
先看看开头的类的声明
在 java 中
public class LinkageRecyclerViewActivity extends BaseActivity
我们用public来表示这个类是公共的 extends表示它继承了一个BaseActivity,而在kotlin中
class LinkageRecyclerViewActivity : BaseActivity()
省去了public,并且‘extends’被 ‘: ’所代替,
接下来再看看变量的声明 java中:
LinkageRecyclerViewActivityHolder linkageRecyclerViewActivityHolder; List<LinkageBean.Data> datas; List<LinkageBean.Data.Weeks> weekses; LinkageBean.Data data; LinkageBean.Data.Weeks weeks; //左侧年的adapter LinkageYearRecyclerViewAdapter linkageYearRecyclerViewAdapter; //右侧的adapter RightAdapter rightAdapter; //结束的年份 int year = 2017; //开始被选中的年份是第几个 private int hadselected = 0; //年份是否被点击 private boolean isTouch; CustomSGLayoutManager yearLinearLayoutManager;
而在kotlin中:
internal lateinit var linkageRecyclerViewActivityHolder: LinkageRecyclerViewActivityHolder internal lateinit var datas: ArrayList<LinkageBean.Data> internal lateinit var weekses: MutableList<LinkageBean.Data.Weeks> internal lateinit var data: LinkageBean.Data internal lateinit var weeks: LinkageBean.Data.Weeks //左侧年的adapter internal lateinit var linkageYearRecyclerViewAdapter: LinkageYearRecyclerViewAdapter //右侧的adapter internal lateinit var rightAdapter: RightAdapter //结束的年份 internal var year = 2017 //开始被选中的年份是第几个 private var hadselected = 0 //年份是否被点击 private var isTouch: Boolean = false internal lateinit var yearLinearLayoutManager: CustomSGLayoutManager
可以看到local的变量在kotlin中用internal 声明,而private的则在两者中相同,比较大的区别在于在java中我们先声明变量的类型在给他命名,而在kotlin中则相反,并且名称与类型中间有个‘:’,在java中我们可以不给变量初始值,而在kotlin中则不可以,如果这个变量之后才有赋值,需要添加lateinit,如:
internal lateinit var rightAdapter: RightAdapter
并且在kotlin中声明一个常量也很简单,直接以 val 就可以
再来看看构造方法有哪些不同:
java:
private void reTypedata(int i){} public static Intent newIntent(Context context) { return new Intent(context, LinkageRecyclerViewActivity.class); }
kotlin:
private fun reTypedata(i: Int) {} companion object { fun newIntent(context: Context): Intent { return Intent(context,LinkageRecyclerViewActivity::class.java) } }
我们发现 void 被 fun 代替了 ,static的方法则被放在了一个companion object {}的模块下,并且LinkageRecyclerViewActivity.class转换为了LinkageRecyclerViewActivity::class.java.
接下来我们看看adapter中有何不同:
java中我们写了一个
private OnClickChooseListener onClickChooseListener; public void setOnClickChooseListener(OnClickChooseListener onClickChooseListener) { this.onClickChooseListener = onClickChooseListener; } public interface OnClickChooseListener { void onChoose(LinkageBean.Data data, int checked); }
用来实现 Recyclerview 的点击事件,在kotlin中,我们直接用lambda表达式实现这个过程
lateinit var onClickChooseListener: (LinkageBean.Data, Int) -> Unit
在java的holder中我们对类的初始化比较简单:
public class LinkageYearRecyclerViewHolder extends RecyclerView.ViewHolder { CheckBox checkBox; public LinkageYearRecyclerViewHolder(View itemView) { super(itemView); checkBox = (CheckBox) itemView.findViewById(R.id.linkage_year_item_cb); } }
而在kotlin中我们直接添加了这个adapter作为参数:
class LinkageYearRecyclerViewHolder(itemView: View,private val adapter: LinkageYearRecyclerViewAdapter) : RecyclerView.ViewHolder(itemView) { internal var checkBox: CheckBox = itemView.findViewById(R.id.linkage_year_item_cb) as CheckBox }
java中添加监听:
itemView.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { if (onClickChooseListener != null) onClickChooseListener.onChoose(data, position); } } );
kotlin中添加监听:
itemView.setOnClickListener { adapter.onClickChooseListener(data,position) }
可以看到kotlin中代码有着大幅度的简化
而在Activity的的实现 java:
linkageYearRecyclerViewAdapter.setOnClickChooseListener(new LinkageYearRecyclerViewAdapter. OnClickChooseListener() { @Override public void onChoose(LinkageBean.Data data, int checked) { forceStopRecyclerViewScroll(linkageRecyclerViewActivityHolder.week); isTouch = false; weekLinearLayoutManager.scrollToPositionWithOffset(checked, 0); hadselected = checked; reTypedata(checked); } });
kotlint :
linkageYearRecyclerViewAdapter.onClickChooseListener = { data, checked -> forceStopRecyclerViewScroll(linkageRecyclerViewActivityHolder.week) isTouch = false weekLinearLayoutManager.scrollToPositionWithOffset(checked, 0) hadselected = checked reTypedata(checked) }
总的来说 kotlin 在语法上面和 java 还是有着一些不同,而且一些 java 转换由于 kotlin 赋值不能为空的问题也会有很多需要注意的地方,我那个懒加载现在还没转明白,还需要在仔细了解了解,希望本篇文章能对大家有帮助。
相关文章推荐
- 利用RecyclerView实现的一个动画给变item的位置和左右滑动删除该RcyclervView的Item条目
- 一个精简的实现RecyclerView可添加header和footer的Demo
- 一个RecyclerView实现QQ空间相册布局
- Recyclerview的一些个人理解与使用(二)实现一个简单的列表界面
- 实现一个列表只需一行代码-RecyclerView适配器暴力封装
- RecyclerView 实现一个小功能
- 关于Recyclerview使用时的一个错误java.lang.NoSuchMethodError: No static method getMatrix(Landroid/view/View;)
- 使用RecyclerView实现QQ空间广告位一个位置两个图时偶遇bug
- Kotlin实现recyclerView列表
- 再说Android RecyclerView局部刷新那个坑——RecyclerView中payload参数实现刷新一个item的局部
- 关于Recyclerview使用时的一个错误java.lang.NoSuchMethodError: No static method getMatrix(Landroid/view/View;)
- 同样一个问题的两种 java 实现代码 的比较
- 使用RecyclerView实现QQ空间广告位一个位置两个图时偶遇bug
- RecyclerView和okhttp结合 实现一个网络请求数据
- 学习的步伐(二)Kotlin 实现Recyclerview列表(补充:tab选项卡+CoordinatorLayout收缩布局+复杂Recyclerview列表)
- 使用RecyclerView实现QQ空间广告位一个位置两个图时偶遇bug
- Android RecyclerView (四)初学,实现长按删除一个Item.
- java使用compareTo实现一个类的对象之间比较大小
- 一个 ScrollView 里面包含 viewpager 嵌套 listview 或 RecyclerView 极少代码实现的流畅滑动效果 处理一个两层滑动 view 的自定义布局,以最少的代码实现,
- Kotlin和RecyclerView的一个demo