博客轉移到個人站點:http://www.wangchengmeng.club/2018/02/01/Kotlin/
歡迎來吐槽
BaseRefresh-Kotlin
Kotlin編寫刷新列表
首先導入庫(使寫起來更方便)
compile ‘org.jetbrains.anko:anko-sdk15:0.9.1’
可以直接下面方式寫:
//mTvContent直接是xml中的id
mTvContent.text = "Hello-World"
mBtnJump2Main.text = "點擊進入"
打開一個Activity 並傳遞參數:
startActivity<FoundActivity>("key" to "from mainactivity")
設置點擊事件
mBtnJump2Main.onClick {
//函數式編程 lamda
Toast.makeText(this, "點擊進入了", Toast.LENGTH_LONG).show()
startActivity<FoundActivity>("key" to "from mainactivity")
}
封裝BaseViewHolder:
open class BaseViewHolder(item: View?) : RecyclerView.ViewHolder(item) {
private lateinit var mContext: Context
private lateinit var mContentView: View
private lateinit var mCacheViews: SparseArray<View>
constructor(context: Context, item: View?) : this(item) {
mContext = context
mContentView = item ?: View(context)
mCacheViews = SparseArray()
}
/**
* 根據viewID獲取對應的View
*/
fun <T : View> retrieveView(@IdRes viewID: Int): T {
var view = mCacheViews.get(viewID)
if (null == view) {
view = mContentView.find(viewID)
mCacheViews.put(viewID, view)
}
return view as T
}
}
封裝BaseAdapter(可添加footer header)
getItemViewType:
override fun getItemViewType(position: Int): Int {
var count: Int = mDatas.size
if (hasHeader()) {
count++
}
//表達式
return if (hasHeader() && 0 == position) {
BaseAdapter.ITEM_TYPE.HEADER.ordinal
} else if (hasFooter() && position == count) {
BaseAdapter.ITEM_TYPE.FOOTER.ordinal
} else {
BaseAdapter.ITEM_TYPE.NORMAL.ordinal
}
}
onCreateViewHolder:
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): BaseViewHolder =
when (viewType) {
BaseAdapter.ITEM_TYPE.HEADER.ordinal -> BaseViewHolder(mContext, mHeaderView)
BaseAdapter.ITEM_TYPE.FOOTER.ordinal -> BaseViewHolder(mContext, mFooterView)
else -> BaseViewHolder(mContext, LayoutInflater.from(mContext).inflate(mLayoutID, parent, false))
}
onBindViewHolder:
override fun onBindViewHolder(holder: BaseViewHolder, position: Int) {
if (hasHeader() && 0 == position) {
return
}
var count = mDatas.size
if (hasHeader()) {
count++
}
if (hasFooter()) {
count++
}
if (hasFooter() && position == count - 1) {
return
}
if (hasHeader()) {
onChildBindViewHolder(holder, getData(position - 1))
} else {
onChildBindViewHolder(holder, getData(position))
}
}
一系列封裝後,常用的列表Adapter中所有的代碼:
class RvListAdapter(private val mContext: Context, private val mLayout: Int, private val mDatas: List<ListBean>) : BaseAdapter<ListBean>(mContext, mLayout, mDatas) {
constructor(context: Context, listData: ArrayList<ListBean>) : this(context, R.layout.item_list, listData)
override fun onChildBindViewHolder(holder: BaseViewHolder, data: ListBean?) {
//方式1 - 使用base中的方法獲取View
// holder.retrieveView<TextView>(R.id.mTvName).text = data?.name ?: "chenxiaipie"
// holder.retrieveView<TextView>(R.id.mTvSex).text = data?.sex ?: "woman"
// holder.retrieveView<TextView>(R.id.mTvAge).text = data?.age?.toString() ?: ""
//方式2
holder.itemView.mTvName.text = data?.name ?: "chenxiaopie"
holder.itemView.mTvSex.text = data?.sex ?: "woman"
holder.itemView.mTvAge.text = data?.age?.toString() ?: ""
}
}
以上是根據 https://github.com/wangchengmeng/RefreshRecyclerView 所封裝下拉刷新列表使用kotlin簡單的實現,熟悉一下kotlin的寫法,kotlin還有更多實用簡單的寫法,僅供學習