viewmodel+livedata+binding 实现listview+adapter
生活随笔
收集整理的這篇文章主要介紹了
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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 五星式神转换券怎么得
- 下一篇: 苹果xr红色为什么是特别版(苹果官网报价