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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市暇咆,隨后出現(xiàn)的幾起案子锋爪,更是在濱河造成了極大的恐慌丙曙,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件其骄,死亡現(xiàn)場離奇詭異亏镰,居然都是意外死亡,警方通過查閱死者的電腦和手機拯爽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進店門索抓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人某抓,你說我怎么就攤上這事纸兔。” “怎么了否副?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵汉矿,是天一觀的道長。 經(jīng)常有香客問我备禀,道長洲拇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任曲尸,我火速辦了婚禮赋续,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘另患。我一直安慰自己纽乱,他們只是感情好,可當我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布昆箕。 她就那樣靜靜地躺著鸦列,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鹏倘。 梳的紋絲不亂的頭發(fā)上薯嗤,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天,我揣著相機與錄音纤泵,去河邊找鬼骆姐。 笑死,一個胖子當著我的面吹牛捏题,可吹牛的內(nèi)容都是我干的玻褪。 我是一名探鬼主播,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼涉馅,長吁一口氣:“原來是場噩夢啊……” “哼归园!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起稚矿,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤庸诱,失蹤者是張志新(化名)和其女友劉穎捻浦,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體桥爽,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡朱灿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了钠四。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盗扒。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖缀去,靈堂內(nèi)的尸體忽然破棺而出侣灶,到底是詐尸還是另有隱情,我是刑警寧澤缕碎,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布褥影,位于F島的核電站,受9級特大地震影響咏雌,放射性物質(zhì)發(fā)生泄漏凡怎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一赊抖、第九天 我趴在偏房一處隱蔽的房頂上張望统倒。 院中可真熱鬧,春花似錦氛雪、人聲如沸房匆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽坛缕。三九已至,卻和暖如春捆昏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背毙沾。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工骗卜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人左胞。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓寇仓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親烤宙。 傳聞我的和親對象是個殘疾皇子遍烦,可洞房花燭夜當晚...
    茶點故事閱讀 45,870評論 2 361

推薦閱讀更多精彩內(nèi)容