image.png
在app build.gradle開啟databinding 和 bindingAdapter
// DataBinding開啟 啟用中
buildFeatures {
dataBinding = true
}
// 支持 bindingAdapter
apply plugin: "kotlin-kapt"
kapt {
generateStubs = true
}
創(chuàng)建UserRepository ,用來請求網(wǎng)絡拿數(shù)據(jù)诈唬,或者從數(shù)據(jù)庫中拿數(shù)據(jù)
class Repository private constructor(){
companion object{
val mUserRepository = UserRepositoryHolder.holder
}
private object UserRepositoryHolder {
val holder = Repository()
}
fun getArticles(listenner:onLoadArticleListenner){
HttpClient.instance.instanceRetrofit(WanAndroidApi::class.java)
.getArticles(1)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : ResponseObserve<ArticleResponse>() {
override fun success(data: ArticleResponse?) {
data?.let { listenner.loadSuccess(it) }
}
override fun failure(errorMsg: String?) {
errorMsg?.let { listenner.loadError(it) }
}
})
}
interface onLoadArticleListenner{
fun loadSuccess(data:ArticleResponse);
fun loadError(msg:String)
}
}
創(chuàng)建viewmodel 支持屏幕旋轉(zhuǎn)數(shù)據(jù)能維持冗澈,和同個activity 里面的fragment 能夠數(shù)據(jù)共享
class ArticleListViewModel : ViewModel() {
var articles: MutableLiveData<List<Article>>? = null
var loaddingLiveData: MutableLiveData<Boolean>? = null
init {
articles = MutableLiveData()
loaddingLiveData = MutableLiveData()
}
fun getArticles() {
loaddingLiveData?.value = true
UserRepository.mUserRepository.getArticles(object : UserRepository.onLoadArticleListenner {
override fun loadSuccess(data: ArticleResponse) {
loaddingLiveData?.value = false
articles?.setValue(data.datas);
}
override fun loadError(msg: String) {
loaddingLiveData?.value = false
articles?.setValue(null);
}
})
}
}
activity布局 并引入前面創(chuàng)建的viewmodel
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:bind="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="mv"
type="com.amn.jetpackmvvm.test.ArticleListViewModel" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.scwang.smartrefresh.layout.SmartRefreshLayout
android:id="@+id/homeRefreshLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/collectRecycleView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</com.scwang.smartrefresh.layout.SmartRefreshLayout>
</LinearLayout>
</layout>
在activity 綁定布局伶丐,和獲取viewmodel并且設置viewmodel (在布局引入viewmodel 后 databinding才會有設置viewmodel 方法)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//databinding 綁定布局
articlelistBinding =
DataBindingUtil.setContentView<ActivityArticleListBinding>(this, activity_article_list)
articlelistBinding?.lifecycleOwner = this
//獲取viewmodel
artcleViewModel = ViewModelProvider(this).get(ArticleListViewModel::class.java);
//databinding 和viewmodel 綁定
articlelistBinding?.mv = artcleViewModel
}
目前這個和activity 綁定的viewmodel 暫沒用到明吩,后面可用來跟新刷新狀態(tài),或者可用bindingAdapter 綁定刷新和加載更多事件
接下來 recycleview 的設置入偷,因在viewmodel 采用livedata 可用來數(shù)據(jù)雙向綁定,這里只是單項械哟,在activity中 監(jiān)聽 數(shù)據(jù)變化,設置對應的adapter 數(shù)據(jù)
private fun observeLivaData() {
artcleViewModel?.loaddingLiveData?.observe(this, Observer {
if (!it) {
articlelistBinding?.homeRefreshLayout?.finishRefresh()
}
})
artcleViewModel?.articles?.observe(this, Observer {
articleAdapter?.setData(it)
})
}
在adapter中
class ArticleAdapter(context: Context) : Adapter<ArticleAdapter.ArticleViewHolder>() {
var datas: ArrayList<Article>? = ArrayList()
val context: Context = context
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ArticleViewHolder {
val inflate = DataBindingUtil.inflate<ItemArticleBinding>(
LayoutInflater.from(context),
R.layout.item_article,
parent,
false
)
return ArticleViewHolder(inflate.root)
}
override fun getItemCount(): Int {
return (if (datas == null) 0 else datas?.size)!!
}
override fun onBindViewHolder(holder: ArticleViewHolder, position: Int) {
val article = datas?.get(position)
val binding = DataBindingUtil.getBinding<ItemArticleBinding>(holder.itemView);
binding?.itemArticle = article
binding?.executePendingBindings()
}
fun setData(articles: List<Article>) {
datas?.clear()
datas?.addAll(articles)
notifyDataSetChanged()
}
class ArticleViewHolder(itemView: View) : ViewHolder(itemView) {
}
}
databinding ,livedata,viewmodel 基礎使用就到這里了疏之,有空后面還會加room 以及他們更多用法