1. 程式人生 > >kotlin實現一個Recyclerview與java的比較

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

我們發現 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 賦值不能為空的問題也會有很多需要注意的地方,我那個懶載入現在還沒轉明白,還需要在仔細瞭解瞭解,希望本篇文章能對大家有幫助。

相關推薦

kotlin實現一個Recyclerviewjava比較

最近在學習kotlin,本來想把之前的Recyclerview專案直接轉為kotlin,但是一頓轉換後發現那個Fragment的介面沒有加載出來,看來還需要在學習學習。下面讓我們看看java實現Recyclerview與kotlin實現Recyclerview有

Android RecyclerViewListView比較

gets 功能 itemid nested dem 集合 title fyi 這一 RecyclerView 概述 RecyclerView 集成自 ViewGroup 。RecyclerView是Android-support-V7版本中新增的一個Widgets,官方對

兩個棧實現一個佇列(java

一、問題描述 使用兩個棧實現一個佇列 二、演算法分析 棧是先進後出,因此兩個可以模擬實現先進先出 三、演算法設計 定義資料結構 Stack<Integer> stack1 Stack<Integer> stack2 對於push操作:元素入佇列

內部類實現多繼承(內部類的優勢)及內部類實現一個介面外圍類實現這個介面的區別

在java中一個類可以多重實現,但不能多重繼承,也就是說一個類能夠同時實現多個介面,但不能同時繼承多個類。但有時候我們確實需要繼承多個類,比如希望擁有兩個類的行為功能,就很難使用單繼承來解決問題了(當然多層繼承是可以解決的),那麼我們還可以用什麼辦法來解決多重繼承的問題呢?沒

內部類實現一個介面外圍類實現這個介面的區別

在java中,外圍類只能繼承一個基類,要實現多繼承,只有繼承多個介面型別。有時,你需要與介面的實現進行互動,所以使用內部類最重要的一個原因是:每個內部類都能獨立的繼承自一個(介面的)實現,內部類允許你繼承多個非介面型別。正是因為內部類的這種能力,有效的實現了“多重繼承”。

groovyjava比較,展現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模擬一個clientwebclient通信

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