Kotlin系列二(Kotlin實現RecyclerView加item點選處理)
阿新 • • 發佈:2019-02-18
上一篇分享了kotlin基礎語法,這一篇分享kotlin在Android開發中的實際應用,希望對正在學習的小夥伴有幫助。
新增的依賴:
/*RecyclerView*/ implementation 'com.android.support:recyclerview-v7:26.1.0' /*retrofit*/ compile 'com.squareup.retrofit2:retrofit:2.1.0' compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0' compile 'com.squareup.retrofit2:converter-gson:2.1.0' /*Okhttp*/ compile 'com.squareup.okhttp3:okhttp:3.2.0' compile 'com.squareup.okhttp3:logging-interceptor:3.2.0' /*rxjava*/ compile 'io.reactivex:rxjava:1.1.0' compile 'io.reactivex:rxandroid:1.1.0' /*glide*/ compile 'com.github.bumptech.glide:glide:3.7.0'
Activity程式碼:
class MainActivity: AppCompatActivity() { val BASE_URL: String = "http://112.124.22.238:8081" private var mAPIService: APIService? = null var mDataList: ArrayList<MainDataBean> = ArrayList() init { mAPIService = initRetrofitClient() } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) rv_main_content.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false) rv_main_content.adapter = MainRecyclerAdapter(this, mDataList, ClickCallback()) refreshData() } private fun refreshData(){ //本地偽資料 //return (0..25).mapTo(ArrayList()) { MainDataBean("${it}".toInt(), "test data $it", 0, "" )} //網路請求資料 mAPIService!!.onRequestBannerData(1) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe({ responseData -> mDataList.addAll(responseData) rv_main_content.adapter.notifyDataSetChanged() }) } inner class ClickCallback: OnClickCallback { override fun onClick(view: View, position: Int) { val tvId: TextView = view.findViewById(R.id.tv_main_item_id) val tvName: TextView = view.findViewById(R.id.tv_main_item_name) showToast(this@MainActivity, "position:$position, name:${tvId.text},name:${tvName.text}") } } //顯示Toast private fun showToast(context: Context, message: String, duration: Int = Toast.LENGTH_SHORT) { Toast.makeText(context, message, duration).show() } //Retrofit private fun initRetrofitClient(): APIService { return Retrofit.Builder() .baseUrl(BASE_URL) .client(initOkHttpClient()) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build() .create(APIService::class.java) } //OkhttpClient private fun initOkHttpClient(): OkHttpClient { return OkHttpClient.Builder() .connectTimeout(5, TimeUnit.SECONDS) .writeTimeout(5, TimeUnit.SECONDS) .readTimeout(5, TimeUnit.SECONDS) .build() } }
Adapter程式碼:
class MainRecyclerAdapter(context: Context, dataBeanList: ArrayList<MainDataBean>, onClickCallback: OnClickCallback) : RecyclerView.Adapter<MainRecyclerAdapter.MainRecyclerViewHolder>() { private var mContext = context private var mDataBeanList = dataBeanList private var mOnClickCallback = onClickCallback override fun onBindViewHolder(holder: MainRecyclerViewHolder?, position: Int) { var mainDataBean: MainDataBean = mDataBeanList[position] Glide.with(mContext).load(mainDataBean.imgUrl).into(holder?.tvImg) holder?.tvId?.text = mainDataBean.id.toString() holder?.tvName?.text = mainDataBean.name holder?.itemView?.tag = position } override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): MainRecyclerViewHolder { val view: View = LayoutInflater.from(mContext).inflate(R.layout.item_main, parent, false) view.setOnClickListener(ClickListener()) return MainRecyclerViewHolder(view) } override fun getItemCount(): Int { return mDataBeanList.size } inner class MainRecyclerViewHolder(view: View): RecyclerView.ViewHolder(view) { var tvImg: ImageView = view.findViewById(R.id.iv_main_item_img) var tvId: TextView = view.findViewById(R.id.tv_main_item_id) var tvName: TextView = view.findViewById(R.id.tv_main_item_name) } inner class ClickListener: View.OnClickListener { override fun onClick(v: View?) { mOnClickCallback.onClick(v!!, v.tag as Int) } } }
處理Item點選回撥的介面:
interface OnClickCallback {
fun onClick(view: View, position: Int)
}
Retrofit的api介面:
interface APIService {
@GET("/course_api/banner/query?")
fun onRequestBannerData(@Query("type") id: Int): Observable<List<MainDataBean>>
}
Data class:
data class MainDataBean(var id: Int, var name: String, var type: Int, var imgUrl: String)