第一次使用kotlinx书写android实践

实现效果

列表效果

如上图,想要kotlinx实现上面的效果,以为很简单,但却碰到不少的坑,毕竟还没学过kotlinx语法,不过最终还是弄出来了,在这里记录下。

准备

工欲善其事必先利其器,所以我们首先要准备好环境,在这里我使用的是AS 3.0预览版,本身就支持kotlinx,使用2.x的要装插件支持,不过我觉得使用就使用3.0吧,毕竟是亲爹支持的,新建项目什么的省了,不知道的google下...

开发

MainActivity.kt

import android.os.Bundle
import android.support.design.widget.Snackbar
import android.support.v7.app.AppCompatActivity
import android.view.Menu
import android.view.MenuItem
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        setSupportActionBar(toolbar)

        supportFragmentManager.beginTransaction()
                .add(R.id.fragment, MainActivityFragment(), "MainActivityFragment")
                .commit();

        fab.setOnClickListener { view ->
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show()
        }
    }

    override fun onCreateOptionsMenu(menu: Menu): Boolean {
        // Inflate the menu; this adds items to the action bar if it is present.
        menuInflater.inflate(R.menu.menu_main, menu)
        return true
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        return when (item.itemId) {
            R.id.action_settings -> true
            else -> super.onOptionsItemSelected(item)
        }
    }
}

这里要注意下,由于kotlinx与java的语法风格不一样,所以要特别注意:

  1. 继承不再写extends,而是直接:表示;
  2. 使用类里面的成员或方法时,直接 supportFragmentManager.beginTransaction(),而不再 getSupportFragmentManager().beginTransaction(),很简洁;
  3. 获取控件时,没有了findViewById,而是直接使用id来引用,不过这里要注意,引入的时候记得引入import kotlinx.android.synthetic.main.activity_main.*这个。

activity_main.xml




    

        

    

    
    

MainActivityFragment.mk

import android.os.Bundle
import android.support.v4.app.Fragment
import android.support.v7.widget.LinearLayoutManager
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import kotlinx.android.synthetic.main.fragment_main.*

/**
 * A placeholder fragment containing a simple view.
 */
class MainActivityFragment : Fragment() {

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.fragment_main, container, false)
    }

    override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        recycler_view.layoutManager = LinearLayoutManager(context)

        val list = ArrayList()
        var i: Int = 0
        while (i < 10) {
            list.add("item---" + i)
            i++
        }
        val adapter = ListAdapter(context)
        recycler_view.adapter = adapter
        adapter.setDataList(list)
    }
}

ListAdapter.kt

import android.content.Context
import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater
import android.view.ViewGroup

/**
 * @author LiaoJH
 * @VERSION 1.0
 * email: [email protected]
 * @DESC TODO
 */
class ListAdapter(context: Context) : RecyclerView.Adapter() {
    private var mLayoutInflate: LayoutInflater = LayoutInflater.from(context)
    private var mDataList: List? = null

    fun setDataList(dataList: List) {
        mDataList = dataList
    }

    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ListHolder {
        return ListHolder(mLayoutInflate.inflate(R.layout.list_item_layout, parent, false))
    }

    override fun getItemCount(): Int {
        if (mDataList == null) return 0
        else
            return mDataList?.size as Int
    }

    override fun onBindViewHolder(holder: ListHolder?, position: Int) {

        holder?.bindData(mDataList?.get(position) as String)
    }

}

list_item_layout.xml




    

ListHolder.kt

import android.support.v7.widget.RecyclerView
import android.view.View
import android.widget.TextView

/**
 * @author LiaoJH
 * @VERSION 1.0
 * email: [email protected]
 * @DESC TODO
 */
class ListHolder(itemView: View?) : RecyclerView.ViewHolder(itemView) {
    private var mNameTv: TextView = itemView?.findViewById(R.id.name_tv) as TextView

    fun bindData(name: String) {
        mNameTv.text = name
    }
}

这样就能实现开头的效果了,第一次使用kotlinx,还是有不少坑,在此记录下。

你可能感兴趣的:(第一次使用kotlinx书写android实践)