Kotlin学习加载豆瓣电影列表

Posted by on September 29, 2018
  • 随着Kotlin1.2.7版本发布Androidstudio3.2稳定版本发布,增加了更多的Kotlin支持,是时候学习Kotlin
  • 学习看这个地址就行了,不懂的搜索下就差不多了,https://www.kotlincn.net/docs/reference/coroutines.html
  • 我这篇不讲语法看文档就可以,我大概磨磨唧唧看了3天文档,没咋实地操作,只是看,所有才有这篇文章动手写个demo
  • 功能很简单,动态网络获取数据加载然后列表显示,这就是我们正常开发APP一个流程,这个能走通了,剩下就是自己慢慢琢磨,就可以开发项目了

  • 网络请求用的是Retrofit
class DoubanRetrofit {
     fun getData( ca:RetrofitCallBack<NowSHowMove>) {
        val retrofit: Retrofit = Retrofit.Builder()
                .baseUrl("http://api.douban.com/v2/movie/")
                .addConverterFactory(GsonConverterFactory.create())
                .build()
        val ipService = retrofit.create(DouBanApi::class.java)

        ipService.getNowSHowingMove().enqueue(object:Callback<NowSHowMove>{
            override fun onResponse(call: Call<NowSHowMove>?, response: Response<NowSHowMove>?) {
                if (response != null) {
                    ca?.succes(response)
                };

            }
            override fun onFailure(call: Call<NowSHowMove>?,         t: Throwable?) {

            }

        })

    }

}

这里的需要注意的地方,因为ktjava是可以互向调用的所以,方便很多,网络库就可以继续使用okhttp,这里序号注意的是回调解析的对象response不能直接获取属性值,需要response.body()才能得到NowSHowMove我们封装的列表数据

  • view的绑定显示不在需要findview也不用bf,使用View Binding,当你新建工程的时候已经自动添加进来了 ` rv.adapter= NowShowMoveAdapter(response.body()!!);这样就相当于setAdapter,这里需要注意我们的View Binding同样可以用于adapter`
 class RecyclerHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        fun setData(entriesItem: EntriesItem) {
            itemView.tv.text=entriesItem.title;
            itemView.tv_show_time.text="上映时间: "+entriesItem.pubdate;
            itemView.tv_rating.text="评分: "+entriesItem.rating;
            Glide.with(itemView.context).load(entriesItem.images.large!!).into(itemView.iv);
        }
    }
  • 显示数据

class NowShowMoveAdapter(private val mNowSHowMove: NowSHowMove) : RecyclerView.Adapter<NowShowMoveAdapter.RecyclerHolder>() {


    override fun onCreateViewHolder(parent: ViewGroup, postion: Int): RecyclerHolder {
        val view = LayoutInflater.from(App.instance).inflate(R.layout.item_now_show_move, parent, false)
        return RecyclerHolder(view);
    }

    override fun getItemCount(): Int {
        return mNowSHowMove.entries!!.size;
    }

    override fun onBindViewHolder(vh: RecyclerHolder, postion: Int) {
        vh.setData(mNowSHowMove.entries!![postion]);
    }

    class RecyclerHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        fun setData(entriesItem: EntriesItem) {
            itemView.tv.text=entriesItem.title;
            itemView.tv_show_time.text="上映时间: "+entriesItem.pubdate;
            itemView.tv_rating.text="评分: "+entriesItem.rating;
            Glide.with(itemView.context).load(entriesItem.images.large!!).into(itemView.iv);
        }
    }


}
  • 这里需要注意构造函数传值,可以直接写在类名上,这样我们就不需要在定义成员变量了,到此整个数据就加载完毕,代码已经上传:https://github.com/l123456789jy/DouBan