databinding+liveData+viewmodel recycleview 簡單使用

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 支持屏幕旋轉數(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 以及他們更多用法

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容