kotlin学习笔记

kotlin中XML代码段是不变的

  <androidx.recyclerview.widget.RecyclerView
                android: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? = null

    fun 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? = null
    private var listBean: ArrayList<ShopListBean.DataBean.RecordsBean>? = null

    constructor(context: Context, shopListBean: ArrayList<ShopListBean.DataBean.RecordsBean>) {
        this.mContext = context
        this.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: ImageView
        var shopPrice: TextView
        var shopName: TextView

        constructor(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 = false
        rv_list.adapter = mShopAdapter
        
        mShopAdapter!!.OnItemClick = { _, position ->
            shopOnClisk(position)
        }

 

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐