这几天在工作之余学习kotlin语言,刚好接触到了RecyclerView和DrawerLayout,作为一个Android开发的新手,肯定是想多学习一下相关的知识,就使用kotlin语言做了一个抽屉效果的布局,布局中的列表使用的是RecyclerView,希望能给码友们一些帮助;
package com.example.uworks.kotlinfordrag
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.support.v7.widget.LinearLayoutManager
import android.support.v7.widget.RecyclerView
import java.util.*
class MainActivity : AppCompatActivity() {
var recycle: RecyclerView? = null
var recycle1: RecyclerView? = null
var list = ArrayList<String>()
var list1 = ArrayList<String>()
var adapter: AdapterForR? = null
var adapter1: AdapterForR1? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
recycle = findViewById(R.id.id_recyclerview)as RecyclerView
recycle1 = findViewById(R.id.id_recyclerview1) as RecyclerView
recycle?.layoutManager = LinearLayoutManager(this)
recycle1?.layoutManager =LinearLayoutManager(this)
recycle?.addItemDecoration(Divider(this,LinearLayoutManager.HORIZONTAL))
recycle1?.addItemDecoration(Divider(this,LinearLayoutManager.HORIZONTAL))
initData()
}
private fun initData(){
for (i in 0..10){
list?.add("list:内容"+i)
list1?.add("list1:内容"+i)
}
adapter = AdapterForR(this,list!!)
adapter1 = AdapterForR1(this,list1!!)
recycle?.adapter = adapter
recycle1?.adapter = adapter1
}
}
在kotlin中?和!!还没有弄的很透彻,但是给我的感觉就是用?比较多一些,可以看出来kotlin的语言比较直接些,也节省了代码量。
下面是RecyclerView的adapter,这个和我们之前的listview的Adapter有很大的区别
package com.example.uworks.kotlinfordrag
import android.content.Context
import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import com.example.uworks.kotlinfordrag.AdapterForR.ViewHold
/**
* Created by UWorks on 2016/8/19.
*/
class AdapterForR(internal var mContext: Context, internal var list: List<String>) : RecyclerView.Adapter<ViewHold>(){
override fun getItemCount(): Int {
return list.size
}
override fun onBindViewHolder(holder: ViewHold, position: Int) {
holder.text.text=list.get(position)
}
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHold {
var holder = ViewHold(LayoutInflater.from(mContext).inflate(R.layout.layout_item,null))
return holder
}
class ViewHold(itemView: View) : RecyclerView.ViewHolder(itemView) {
var text:TextView
init {
text = itemView.findViewById(R.id.tv_item) as TextView
}
}
}
在recycleView中是没有divider这个属性的,我们需要手动添加,并且Google也没有为我们提供一些简单的模式,这需要我们自己通过继承
RecyclerView.ItemDecoration这个类
package com.example.uworks.kotlinfordrag import android.content.Context import android.graphics.Canvas import android.graphics.Rect import android.graphics.drawable.Drawable import android.support.v7.widget.LinearLayoutManager import android.support.v7.widget.RecyclerView import android.util.Log import android.view.View /** * Created by UWorks on 2016/8/19. */ class Divider : RecyclerView.ItemDecoration { private val ATTRS = intArrayOf(android.R.attr.listDivider) private var mDivider: Drawable private var mOrientation: Int = 0 constructor(context: Context, orientation: Int):super() { val a = context.obtainStyledAttributes(ATTRS) mDivider = a.getDrawable(0) a.recycle() setOrientation(orientation) } fun setOrientation(orientation: Int) { if (orientation != LinearLayoutManager.VERTICAL && orientation != LinearLayoutManager.HORIZONTAL) { throw IllegalArgumentException("invalid orientation") } mOrientation = orientation } override fun onDraw(c: Canvas, parent: RecyclerView) { Log.v("recyclerview - itemdecoration", "onDraw()") if (mOrientation == LinearLayoutManager.HORIZONTAL) { drawVertical(c, parent) } else { drawHorizontal(c, parent) } } fun drawVertical(c: Canvas, parent: RecyclerView) { val left = parent.paddingLeft val right = parent.width - parent.paddingRight val childCount = parent.childCount for (i in 0..childCount - 1) { val child = parent.getChildAt(i) val v = android.support.v7.widget.RecyclerView(parent.context) val params = child.layoutParams as RecyclerView.LayoutParams val top = child.bottom + params.bottomMargin val bottom = top + mDivider.getIntrinsicHeight() mDivider.setBounds(left, top, right, bottom) mDivider.draw(c) } } fun drawHorizontal(c: Canvas, parent: RecyclerView) { val top = parent.paddingTop val bottom = parent.height - parent.paddingBottom val childCount = parent.childCount for (i in 0..childCount - 1) { val child = parent.getChildAt(i) val params = child.layoutParams as RecyclerView.LayoutParams val left = child.right + params.rightMargin val right = left + mDivider.getIntrinsicHeight() mDivider.setBounds(left, top, right, bottom) mDivider.draw(c) } } override fun getItemOffsets(outRect: Rect, itemPosition: Int, parent: RecyclerView) { if (mOrientation == LinearLayoutManager.HORIZONTAL) { outRect.set(0, 0, 0, mDivider.getIntrinsicHeight()) } else { outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0) } } }