美文网首页
MVVM之列表绑定binding-collection-adap

MVVM之列表绑定binding-collection-adap

作者: 小小的coder | 来源:发表于2020-01-10 15:48 被阅读0次

Easy way to bind collections to listviews and recyclerviews with the new Android Data Binding framework 。

简单的在Data Binding中绑定listviews 和recyclerviews 。
github地址:https://github.com/evant/binding-collection-adapter
如果支持androidx 和databinding v2使用3.0.0版本:

compile 'me.tatarka.bindingcollectionadapter2:bindingcollectionadapter:3.0.0'
compile 'me.tatarka.bindingcollectionadapter2:bindingcollectionadapter-recyclerview:3.0.0'

或者使用早起的稳定版本

compile 'me.tatarka.bindingcollectionadapter2:bindingcollectionadapter:2.2.0'
compile 'me.tatarka.bindingcollectionadapter2:bindingcollectionadapter-recyclerview:2.2.0'

简单说一下androidx 和databinding v2:

从 API 28(Android 9.0,Pie)开始,Google 推荐开发者从原来的各种支持库转移到一个新版本的名为 AndroidX 的支持库。它相比老支持库有着无需操心版本控制、实时更新的优点。原有的支持库将被保留并且可以继续使用,但接下来所有新的支持都将发布在 AndroidX 上。按照官方文档说明 androidx 是对 android.support.xxx 包的整理后产物。由于之前的support包过于混乱,所以,google推出了 androidX。
Android常用的架构有:MVC、MVP、MVVM,而MVVM是唯一一个官方提供支持组件的架构,我们可以通过Android lifecycle系列组件、DataBinding或者通过组合两者的形式来打造一个强大的MVVM架构。而DataBinding Compiler V2就是为了解决目前的MVVM架构中的缺点而诞生的。在DataBinding Compiler V1的环境下,DataBinding和LiveData是无法兼容的。
使用
提供一个items 和ItemBinding 来绑定layout。如果要使用databinding的自动更新功能,当数据变化时UI自动更新,必须使用ObservableList 。

public class ViewModel {
public final ObservableList<String> items = new ObservableArrayList<>();
public final ItemBinding<String> itemBinding = ItemBinding.of(BR.item, R.layout.item);
}

在xml使用 app:items 和app:itemBinding来绑定。


<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<import type="com.example.R" />
<variable name="viewModel" type="com.example.ViewModel"/>
</data>

<ListView
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  app:items="@{viewModel.items}"
  app:itemBinding="@{viewModel.itemBinding}"/>

<androidx.recyclerview.widget.RecyclerView
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
  app:items="@{viewModel.items}"
  app:itemBinding="@{viewModel.itemBinding}"/>

<android.support.v4.view.ViewPager
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  app:items="@{viewModel.items}"
  app:itemBinding="@{viewModel.itemBinding}"/>

<Spinner
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  app:items="@{viewModel.items}"
  app:itemBinding="@{viewModel.itemBinding}"
  app:itemDropDownLayout="@{R.layout.item_dropdown}"/>

</layout>

在item 的布局中,通过variable 来绑定ItemBinding。


<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable name="item" type="String"/>
</data>

<TextView
  android:id="@+id/text"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:text="@{item}"/>

</layout>

多个View Types
如果有多个view types ,依然用app:itemBinding,然后在OnItemBind 中处理。

public final OnItemBind<String> onItemBind = new OnItemBind<String>() {
@Override
public void onItemBind(ItemBinding itemBinding, int position, String item) {
itemBinding.set(BR.item, position == 0 ? R.layout.item_header : R.layout.item);
}
};

如果使用的是ListView,必须提供 item types的数量,比如:

app:itemTypeCount="@{2}

注意onItemBind 会被多次调用,不要在这里做大量的运算。

绑定多个变量
可以绑定多个变量itemBinding.bindExtra(BR.extra, value)。

public interface OnItemClickListener {
void onItemClick(String item);
}

OnItemClickListener listener = ...;
ItemBinding<Item> itemBinding = ItemBinding.<Item>of(BR.item, R.layout.item)
.bindExtra(BR.listener, listener);

<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable name="item" type="String"/>
<variable name="listener" type="OnItemClickListener"/>
</data>

<TextView
  android:id="@+id/text"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:onClick="@{() -> listener.onItemClick(item)}"
  android:text="@{item}"/>

</layout>

————————————————
原文链接:https://blog.csdn.net/yu75567218/article/details/87860020

相关文章

网友评论

      本文标题:MVVM之列表绑定binding-collection-adap

      本文链接:https://www.haomeiwen.com/subject/xvxmactx.html