最近在学习Kotlin,由于公司的项目全都是java,所以自己动手撸了一个微博热搜列表熟悉一下Kotlin网络请求模块,在此记录一下。
废话不多说,上代码。
首先导入相关的库
// Retrofit
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
// Retrofit和jxjava关联
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
// Retrofit使用Gson转换
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
// RxJava
implementation 'io.reactivex.rxjava2:rxjava:2.2.13'
// RxAndroid
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
//glide
implementation 'com.github.bumptech.glide:glide:4.9.0'
//BRVAH
implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.4'
然后再撸一个BaseActivity,这里用一下DataBinding,省去findviewById。然后初始化OkHttpClient和Retrofit,数据源这里我使用的是天行数据,大家可以注册一个,部分API每天100次免费调用。还有ApiService接口列表也添加一下,接口为 weibohot/index,Bean拿返回的Json生成一下。
open class BaseActivity<AB : ViewDataBinding> : AppCompatActivity() {
lateinit var binding: AB
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
fun setLayout(activity: Activity, layoutId: Int) {
binding = DataBindingUtil.setContentView(activity, layoutId);
}
fun showToast(msg: String) {
Toast.makeText(applicationContext, msg, Toast.LENGTH_SHORT).show()
}
fun startActivity(clazz: Class<*>) {
startActivity(Intent(this, clazz))
}
var client = OkHttpClient()
var mRetrofit: Retrofit = Retrofit.Builder()
.baseUrl(Constant.BASE_URL)
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build()
val apiService: ApiService = mRetrofit.create(ApiService::class.java)
}
interface ApiService {
@GET("weibohot/index")
fun getWeiboHot(
@Query("key") key: String?
): Call<WeiboHotBean>
}
object Constant {
const val TIANAPI_KEY = "you_key"
const val BASE_URL = "http://api.tianapi.com/txapi/"
}
然后开撸微博列表,使用BRVAH库,把Adapter写出来,itemView也很简单,三个TextView,这里就不放了。
class WeiboHotAdapter(layoutResId: Int) : BaseQuickAdapter<HotBean, BaseViewHolder>(layoutResId) {
override fun convert(holder: BaseViewHolder, item: HotBean) {
holder.setText(R.id.tv_num, (holder.adapterPosition + 1).toString())
.setText(R.id.tv_name, item.hotword)
.setText(R.id.tv_hot, item.hotwordnum)
}
}
最后开发WeiboHotActivity,布局就一个RecyclerView,没啥好说的。初始化一下RecyclerView 与Adapter,然后直接使用BaseActivity 里初始化好的 apiService.getWeiboHot ,入参填自己的key,在onResponse里setAdapter即可。这里点击事件对应的是直接跳转微博,如何跳转微博搜索结果知道的老哥可以回复一下。
class WeiboHotActivity : BaseActivity<ActivityWeiboBinding>() {
lateinit var mAdapter: WeiboHotAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setLayout(this, R.layout.activity_weibo)
title = "微博热搜"
binding.rv.layoutManager = LinearLayoutManager(binding.rv.context)
binding.rv.itemAnimator = DefaultItemAnimator()
mAdapter = WeiboHotAdapter(R.layout.item_weibo_hot)
mAdapter.setOnItemClickListener() { adapter, view, position -> toWeibo() }
apiService.getWeiboHot(Constant.TIANAPI_KEY)
.enqueue(object : Callback<WeiboHotBean> {
override fun onFailure(call: Call<WeiboHotBean>, t: Throwable) {
showToast(t.message.toString())
}
@SuppressLint("SetTextI18n")
override fun onResponse(
call: Call<WeiboHotBean>,
response: Response<WeiboHotBean>
) {
response.body()?.newslist?.let {
mAdapter.setList(it)
binding.rv.adapter = mAdapter;
}
}
}
)
}
fun toWeibo() {
val intent = Intent()
intent.action = Intent.ACTION_VIEW
intent.addCategory("android.intent.category.DEFAULT")
intent.data = Uri.parse("sinaweibo://splash")
this.startActivity(intent)
}
}
至此,大功告成,由于是练手的Kotlin项目,部分代码写的不足的地方欢迎大家指正。