日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

viewmodel+livedata+binding 实现listview+adapter

發布時間:2023/12/19 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 viewmodel+livedata+binding 实现listview+adapter 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

首先listview 布局,這是一個fragment的layout,通過binding 自動注入!

fragment_yao_ce.xml

<layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"><data><variable name="yaoCeAdapter" type="android.widget.BaseAdapter"/></data><LinearLayoutandroid:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><ListViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:id="@+id/list_yaoce_view"app:adapter="@{yaoCeAdapter}"/> </LinearLayout> </layout>

對應 fragment 代碼 kotlin:

var mContext : Context = contextoverride fun onCreateView(inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?): View? {var fragmentYaoCeBinding : FragmentYaoCeBinding = FragmentYaoCeBinding.inflate(inflater,container, false)//初始化 空list datavar mListYaoCeData : List<YaoCe> = ArrayList<YaoCe>()//初始化 空的 屬性展示 listvar listViewProperty : MutableList<ItemThreeProperty> = ArrayList<ItemThreeProperty>()//添加title信息var itemThreeProperty = ItemThreeProperty()itemThreeProperty.indexNum = "序號"itemThreeProperty.strPropertyOne = "數值"itemThreeProperty.strPropertyTwo = "代號描述"itemThreeProperty.strPropertyThree = "信息"listViewProperty.add(itemThreeProperty)var adapter : ListAdapter<ItemThreeProperty> = ListAdapter<ItemThreeProperty>(mContext, listViewProperty,R.layout.linear_text_three_item, BR.itemThree)val model = ViewModelProviders.of(this)[YaoCeViewModel::class.java]//做數據綁定和監聽model.getYaoCe().observe(this, Observer<List<YaoCe>>{ yaoceList ->// update UI, data changeif (yaoceList != null && yaoceList.isNotEmpty()){mListYaoCeData = yaoceListvar listProperty = DataBeanToViewUtil.ListYaoCeBean2View(mListYaoCeData)for (property in listProperty) {listViewProperty.add(property)}adapter.notifyDataSetChanged()}})//設置adapter 變量fragmentYaoCeBinding.setVariable(BR.yaoCeAdapter, adapter)//返回 view rootreturn fragmentYaoCeBinding.root}

對應viewmodel+livedata

import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import com.daobo.wand.data.bean.SOE import com.daobo.wand.data.bean.YaoCe import kotlin.concurrent.thread/*** 遙測* @author xiaolong.li* @time 2020-02-14*/ class YaoCeViewModel : ViewModel() {var list : MutableList<YaoCe> = ArrayList<YaoCe>()//遙測信息private val listYaoCeData: MutableLiveData<List<YaoCe>> by lazy {MutableLiveData<List<YaoCe>>().also {loadData()}}/*** 獲取數據*/fun getYaoCe() : LiveData<List<YaoCe>> {return listYaoCeData}private fun loadData() {// Do an asynchronous operation to fetch data.//寫死數據thread(start = true) {for(i in 1..30){val yaoCe = YaoCe()yaoCe.strMsg = "遙測 test"yaoCe.strValue = "10"yaoCe.numDesc = "點數"list.add(yaoCe)}listYaoCeData.postValue(list)}}fun refreshData() {thread(start = true) {val yaoCe = YaoCe()yaoCe.strMsg = "遙測 fresh add"yaoCe.strValue = "10"yaoCe.numDesc = "點數"list.add(yaoCe)listYaoCeData.postValue(list)}} }

對應的 listview item 布局:統一使用的ItemTwoProperties bean,這就是為什么在fragment中,有一個bean 轉換。

<?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"><data><variable name="itemTwo" type="com.daobo.wand.data.viewbean.ItemTwoProperty"/></data><androidx.constraintlayout.widget.ConstraintLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutandroid:id="@+id/num"android:layout_width="0dp"android:layout_height="wrap_content"android:orientation="vertical"app:layout_constraintHorizontal_weight="0.8"app:layout_constraintRight_toLeftOf="@+id/textOne"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintBottom_toBottomOf="parent"android:gravity="center_horizontal"android:background="@drawable/item_text_backgroud"><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:text="@{itemTwo.indexNum}"android:textColor="@color/colorGray"android:textSize="16sp" /></LinearLayout><LinearLayoutandroid:id="@+id/textOne"android:layout_width="0dp"android:layout_height="wrap_content"android:orientation="vertical"app:layout_constraintHorizontal_weight="2"app:layout_constraintRight_toLeftOf="@+id/textTwo"app:layout_constraintLeft_toRightOf="@+id/num"app:layout_constraintTop_toTopOf="parent"app:layout_constraintBottom_toBottomOf="parent"android:gravity="center_horizontal"android:background="@drawable/item_text_backgroud"><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:text="@{itemTwo.strPropertyOne}"android:textColor="@color/colorGray"android:textSize="16sp" /></LinearLayout><LinearLayoutandroid:id="@+id/textTwo"android:layout_width="0dp"android:layout_height="wrap_content"android:orientation="vertical"app:layout_constraintHorizontal_weight="4"app:layout_constraintLeft_toRightOf="@+id/textOne"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintBottom_toBottomOf="parent"android:gravity="center_horizontal"><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:text="@{itemTwo.strPropertyTwo}"android:textColor="@color/colorGray"android:textSize="16sp" /></LinearLayout></androidx.constraintlayout.widget.ConstraintLayout> </layout>

ListAdapter 代碼:

import android.content.Contextimport android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.BaseAdapterimport androidx.databinding.DataBindingUtil import androidx.databinding.ViewDataBinding// ListView 適配器 DataBindingUtil /*** 統一的 list binding adapter* @author xiaolong.li* @time 2020-02-14*/ class ListAdapter<T>(private val context: Context, private val list: List<T>,private val layoutId: Int, private val variableId: Int) : BaseAdapter() {override fun getCount(): Int {return list.size}override fun getItem(position: Int): Any {return list[position]!!}override fun getItemId(position: Int): Long {return position.toLong()}override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {var binding: ViewDataBinding? = nullif (convertView == null) {binding = DataBindingUtil.inflate(LayoutInflater.from(context), layoutId, parent, false)} else {binding = DataBindingUtil.getBinding(convertView)}binding!!.setVariable(variableId, list[position])return binding.root} }

?

總結

以上是生活随笔為你收集整理的viewmodel+livedata+binding 实现listview+adapter的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。