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
网友评论