您的位置:首页 > 编程语言 > Java开发

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 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)
}
}


我们发现 voidfun 代替了 ,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 赋值不能为空的问题也会有很多需要注意的地方,我那个懒加载现在还没转明白,还需要在仔细了解了解,希望本篇文章能对大家有帮助。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐