kotlin学习笔记
kotlin中XML代码段是不变的
<androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/rv_list"android:layout_width="match_parent"android:layout_height="match_parent" />
最主要的是adapter的编写:
还是一样,继承RecycleView.Adapter
然后constructor实例化,传入参数
onCreateViewHolder、onBindViewHolder还是一样
还有点击事件的编写
先声明接口:
interface OnItemClick {fun onItemClick(view: View?, position: Int)}private var mOnItemClick //声明接口: OnItemClick? = nullfun setOnClick(onItemClickListener: OnItemClick?) {mOnItemClick = onItemClickListener}
然后 onBind里写点击事件:
holder.itemView.setOnClickListener (View.OnClickListener { v: View? ->mOnItemClick?.onItemClick(v, position)})
kotlin的声明接口可以用函数型变量来简化回调,也可以这么写
var mOnItemClick: (View, Int) -> Unit = { _, _ -> }override fun onBindViewHolder(holder: ViewHolder, position: Int) {...holder.itemView.setOnClickListener {
// mOnItemClick?.onItemClick(it, position)MyOnClick(it, position)}}
全部代码:
class MainShopAdapter : RecyclerView.Adapter<MainShopAdapter.ViewHolder> {private var mContext: Context? = nullprivate var listBean: ArrayList<ShopListBean.DataBean.RecordsBean>? = nullconstructor(context: Context, shopListBean: ArrayList<ShopListBean.DataBean.RecordsBean>) {this.mContext = contextthis.listBean = shopListBean}override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {val view = LayoutInflater.from(mContext).inflate(R.layout.item_shop, parent, false)return ViewHolder(view)}override fun getItemCount(): Int {return listBean?.size as Int}override fun onBindViewHolder(holder: ViewHolder, position: Int) {val bean = listBean?.get(position)holder.shopPrice.text = ("¥" + bean?.goodsPrice.toString())holder.shopName.text = bean?.goodsName.toString()ImageLoader.getInstance().displayImage(UrlUtils.BASE_IMAGE + bean?.goodsPic, holder.shopImg)holder.itemView.setOnClickListener {OnItemClick(it, position)}}var OnItemClick: (View, Int) -> Unit = { _, _ -> }class ViewHolder : RecyclerView.ViewHolder {var shopImg: ImageViewvar shopPrice: TextViewvar shopName: TextViewconstructor(itemView: View) : super(itemView) {shopImg = itemView.findViewById(R.id.iv_shop_img)shopPrice = itemView.findViewById(R.id.tv_shop_price)shopName = itemView.findViewById(R.id.tv_shop_name)}}
}
调用方法:
mRecordsBeans = ArrayList()mShopAdapter =MainShopAdapter(mContext,mRecordsBeans!!)rv_list.layoutManager =GridLayoutManager(mContext,3,LinearLayoutManager.VERTICAL,false)rv_list.setHasFixedSize(true)rv_list.isNestedScrollingEnabled = falserv_list.adapter = mShopAdaptermShopAdapter!!.OnItemClick = { _, position ->shopOnClisk(position)}