kotlin實現一個Recyclerview與java的比較
最近在學習kotlin,本來想把之前的Recyclerview專案直接轉為kotlin,但是一頓轉換後發現那個Fragment的介面沒有加載出來,看來還需要在學習學習。下面讓我們看看java實現Recyclerview與kotlin實現Recyclerview有什麼不同之處吧。
先看看開頭的類的宣告
在 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 賦值不能為空的問題也會有很多需要注意的地方,我那個懶載入現在還沒轉明白,還需要在仔細瞭解瞭解,希望本篇文章能對大家有幫助。
相關推薦
kotlin實現一個Recyclerview與java的比較
最近在學習kotlin,本來想把之前的Recyclerview專案直接轉為kotlin,但是一頓轉換後發現那個Fragment的介面沒有加載出來,看來還需要在學習學習。下面讓我們看看java實現Recyclerview與kotlin實現Recyclerview有
Android RecyclerView與ListView比較
gets 功能 itemid nested dem 集合 title fyi 這一 RecyclerView 概述 RecyclerView 集成自 ViewGroup 。RecyclerView是Android-support-V7版本中新增的一個Widgets,官方對
兩個棧實現一個佇列(java)
一、問題描述 使用兩個棧實現一個佇列 二、演算法分析 棧是先進後出,因此兩個可以模擬實現先進先出 三、演算法設計 定義資料結構 Stack<Integer> stack1 Stack<Integer> stack2 對於push操作:元素入佇列
內部類實現多繼承(內部類的優勢)及內部類實現一個介面與外圍類實現這個介面的區別
在java中一個類可以多重實現,但不能多重繼承,也就是說一個類能夠同時實現多個介面,但不能同時繼承多個類。但有時候我們確實需要繼承多個類,比如希望擁有兩個類的行為功能,就很難使用單繼承來解決問題了(當然多層繼承是可以解決的),那麼我們還可以用什麼辦法來解決多重繼承的問題呢?沒
內部類實現一個介面與外圍類實現這個介面的區別
在java中,外圍類只能繼承一個基類,要實現多繼承,只有繼承多個介面型別。有時,你需要與介面的實現進行互動,所以使用內部類最重要的一個原因是:每個內部類都能獨立的繼承自一個(介面的)實現,內部類允許你繼承多個非介面型別。正是因為內部類的這種能力,有效的實現了“多重繼承”。
groovy與java比較,展現groovy的魅力
來來,走過路過的朋友們,來看看Groovy這門程式語言的優勢,太簡潔了 java 原始碼: import java.util.List; import java.util.ArrayList; class Erase { private List filterL
Kotlin相關基礎及與Java的不同 的 筆記(仨) --拓展方法和屬性代理
感覺學習進度越來越慢了,一個新的知識點需要學習好久. 22. Kotlin的擴充套件方法和擴充套件屬性 可以自定義方法和運算子啊 可以理解為 加強版的Utils 只需要遵循 fun X.Y():Z{} X為類名 Y為自定義的擴充套件方
用Kotlin寫一個RecyclerView的自定義分割線
很多時候我們在用RecyclerView時需要用到分割線。有時候圖省事就用了一個View佈局給他設定個背景色來實現,這樣做雖然可以實現分割線的效果,但是這麼做是不是有點low了。。。。 其實RecyclerView自己就有設定分割線的方法addItemDecoration,
Json——使用Json jar包實現Json字串與Java物件或集合之間的互相轉換
總結一下利用Json相關jar包實現Java物件和集合與Json字串之間的互相轉換: 1、建立的User類:package com.ghj.packageofdomain; public class User { private int
C++與Java比較
“作為一名C++程式設計師,我們早已掌握了面向物件程式設計的基本概念,而且Java的語法無疑是非常熟悉的。事實上,Java本來就是從C++衍生出來的。” 然而,C++和Java之間仍存在一些顯著的差異。可以這樣說,這些差異代表著技術的極大進步。一旦我們弄清楚了這些差異,就
動手實現一個簡單的java web框架
最近看了《架構探險》這本書,實現了一個簡單的web框架,現在回顧一下完成這個框架的過程是怎麼樣的。 一、預備知識 (一)框架和類庫 首先通過框架和類庫的區別來理解一下框架,比如我們寫程式就像是建造一個房子,框架就像是房子的整體結構(由鋼筋水泥鑄成),我
【QT】:QT實現一個訊號與多個槽的關聯和實現多個訊號與一個槽的關聯
這個問題很簡單,我們定義一個按鈕就是一個訊號,而相應的事件就是一個槽。 而這裡用到的方法就是connect。 connect的兩個例項如下: connect(ui->pushButton_3,SIGNAL(clicked()),this,SLOT
兩個棧實現一個佇列以及兩個佇列實現一個棧(Java)
兩個棧實現一個佇列 import java.util.Stack; public class Demo07 { Stack<Integer> stack1 = new Sta
聊聊UDP、TCP和實現一個簡單的JAVA UDP小Demo
最近真的比較忙,很久就想寫了,可是一直苦於寫點什麼,今天腦袋靈光一閃,覺得自己再UDP方面還有些不瞭解的地方,所以要給自己掃盲。 好了,咱們進入今天的主題,先列一下提綱: 1. UDP是什麼,UDP適用於什麼場景? 2. 寫一個小Demo來加深一下UDP的理解。 3. UDP和TCP的區別
websocket通信 實現java模擬一個client與webclient通信
split 指定 erro nec pan substr use serve star 環境: tomcat 7 maven項目 IDE是IDEA2017 項目功能描述: 啟動項目,會啟動一個web端的websocket-client和一個java模擬的webso
java版資料結構與演算法—佇列、兩個棧實現一個佇列
/** * 佇列:先進先出 */ class MyQueue { int a[]; int maxSize; //大小 int front; //開頭 int rear; //結尾 int nItems; //元素個數 //初始化
kotlin學習筆記:object關鍵字介紹與java中的靜態變數與靜態方法的實現以及@JvmField和@JvmStatic的使用
在java中,靜態變數和靜態方法是我們經常需要用到的東西,但是我們在kotlin中,並不能找到static關鍵字。其實目前在kotlin中,也的確是static概念的,那麼我們該如何在kotlin中實現靜態變數和靜態方法呢?這時就要用到kotlin中的obje
Kotlin概述與Java的比較
Kotlin是JetBrains的一種新的程式語言。它首次出現在2011年,JetBrains推出了名為“科特林”的專案。 Kotlin是開源語言。 基本上像Java一樣,C和C ++ - Kotlin也是“靜態型別程式語言”。靜態型別的程式語言是在使用變數之前不需要定義的
Recyclerview的一些個人理解與使用(二)實現一個簡單的列表介面
公司專案前一段時間有些忙 ,忙完後趕緊就來寫下了這篇文章,上次的文章 中,我們對Recyclerview進行了一個基礎的封裝,這次我們就用上次的封裝實現一個最簡單的Recyclerview。 先來看看效果圖 一個簡單的列表。下面是佈局檔案:
Java RMI 實現一個簡單的GFS(谷歌檔案系統)——背景與設計篇
[TOC] 本系列主要是使用Java RMI 實現一個簡單的GFS(谷歌檔案系統,google file system),這裡介紹GFS背景以及系統的設計相關。 > [為了更好的閱讀以及檢視其他篇章,請檢視原文:[https://www.cnblogs.com/maogen/p/gfs_1.html](h