總結一下kotlin和java的異同:
1.對象
java寫法:MainActivity.this
kotlin 寫法:this@MainActivity
2.類
java寫法:MainActivity.class
kotlin 寫法:MainActivity::class.java
3.繼承
java寫法:
public class MainActivity extends AppCompatActivity {
}
kotlin 寫法:Kotlin 的寫法(在 Kotlin 中被繼承類必須被 open 關鍵字修飾)
class MainActivity : AppCompatActivity() {
}
變量
java寫法:Intent intent = new Intent()
kotlin 寫法:var intent = Intent()
常量
java寫法:final String text = "";
kotlin 寫法:val text = ""
靜態常量
java寫法:
public class MainActivity extends AppCompatActivity {
static final String text = "";
}
kotlin 寫法:(需要注意的是要把靜態變量定義在類上方)
const val text = ""
class MainActivity : AppCompatActivity() {
}
定義方法
java方法
public void test(String message) {
}
kotlin寫法 (Unit 跟 void 一樣效果)
fun test(message : String) : Unit {
}
// 在 Kotlin 可以省略 Unit 這種返回值
fun test(message : String) {
}
重載方法:
java寫法
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}
kotlin寫法
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
}
基本數據類型
java寫法
int i = 1;
long l = 2;
boolean b = true;
float f = 0;
double d = 0;
char c = 'A';
String s = "text";
kotlin的寫法
var i : Int = 1
var l : Long = 2
var b : Boolean = true
var f : Float = 0F
var d : Double = 0.0
var c : Char = 'A'
var s : String = "text"
// 更簡潔點可以這樣,自動推倒類型
var i = 1
var l = 2
var b = true
var f = 0F
var d = 0.0
var c = 'A'
var s = "text"
比較類型
Java 的寫法
if ("" instanceof String) {
}
kotlin的寫法
if ("" is String) {
}
轉換符
java寫法
int number = 100;
System.out.println(String.format("商品數量有%d", number));
kotlin的寫法
var number = 100
println("商品數量有$number")
函數內部函數:
fun checkNum(start:Int,end:Int){
fun isThree(x:Int)=(x%3==0)
fun isFive(x:Int)=(x%5==0)
for (number in start..end){
if (isFive(number)){
Log.e("--main--","K"+"被五整除")
}else if (isThree(number)){
Log.e("--main--","K"+"被三整除")
}
}
}
kotlin 中的lambda
fun add(x:Int,y:Int){
return x+y
}
//可以改成 匿名函數
var add={x:Int,y:Int ->
x+y
}
fun comboTwoValue(x:Int,y:Int,method :(a:Int,b:Int) ->Int):Int{
return method(x,y)
}
kotlin支持擴展功能:
package com.kotlin.base.ext
//Kotlin通用擴展
/*
擴展Observable執行
*/
fun <T> Observable<T>.excute(subscriber: BaseSubscriber<T>, lifecycleProvider: LifecycleProvider<*>) {
this.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.compose(lifecycleProvider.bindToLifecycle())
.subscribe(subscriber)
}
/*
擴展數據轉換
*/
fun <T> Observable<BaseResp<T>>.convert():Observable<T>{
return this.flatMap(BaseFunc())
}
/*
擴展Boolean類型數據轉換
*/
fun <T> Observable<BaseResp<T>>.convertBoolean():Observable<Boolean>{
return this.flatMap(BaseFuncBoolean())
}
/*
擴展點擊事件
*/
fun View.onClick(listener:View.OnClickListener):View{
setOnClickListener(listener)
return this
}
/*
擴展點擊事件,參數為方法 直接傳入一個方法進去調用
view.setOnclicklistener{
method()
}
*/
fun View.onClick(method:() -> Unit):View{
setOnClickListener { method() }
return this
}
/*
擴展Button可用性
*/
fun Button.enable(et:EditText,method: () -> Boolean){
val btn = this
et.addTextChangedListener(object : DefaultTextWatcher(){
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
btn.isEnabled = method()
}
})
}
/*
擴展視圖可見性
*/
fun View.setVisible(visible:Boolean){
this.visibility = if (visible) View.VISIBLE else View.GONE
}
篩選就是這么簡單:
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
super.onBindViewHolder(holder, position)
val model = dataList[position]
//是否選中
holder.itemView.mCheckedCb.isChecked = model.isSelected
//加載商品圖片
holder.itemView.mGoodsIconIv.loadUrl(model.goodsIcon)
//商品描述
holder.itemView.mGoodsDescTv.text = model.goodsDesc
//商品SKU
holder.itemView.mGoodsSkuTv.text = model.goodsSku
//商品價格
holder.itemView.mGoodsPriceTv.text = YuanFenConverter.changeF2YWithUnit(model.goodsPrice)
//商品數量
holder.itemView.mGoodsCountBtn.setCurrentNumber(model.goodsCount)
//選中按鈕事件
holder.itemView.mCheckedCb.onClick {
model.isSelected = holder.itemView.mCheckedCb.isChecked
val isAllChecked = dataList.all {
it.isSelected }
Bus.send(CartAllCheckedEvent(isAllChecked))
notifyDataSetChanged()
}
//商品數量變化監聽
holder.itemView.mGoodsCountBtn.getEditText().addTextChangedListener(object:DefaultTextWatcher(){
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
model.goodsCount = s.toString().toInt()
Bus.send(UpdateTotalPriceEvent())
}
})
}
//返回的界面更新
private fun initObserve() {
Bus.observe<CartAllCheckedEvent>().subscribe { t: CartAllCheckedEvent ->
run {
mAllCheckedCb.isChecked = t.isAllChecked
updateTotalPrice()
}
}.registerInBus(this)
Bus.observe<UpdateTotalPriceEvent>().subscribe {
updateTotalPrice()
}.registerInBus(this)
}