You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
@NonNull@OverridepublicViewHolderonCreateViewHolder(@NonNullViewGroupparent, intviewType) {
// Create a new view, which defines the UI of the list itemLayoutInflaterinflater = LayoutInflater.from(parent.getContext());
//.inflate(R.layout.text_row_item, parent, false);ViewDataBindingbinding = DataBindingUtil.inflate(inflater,itemTemplate.getTemplateId(),parent, false );
returnnewViewHolder(binding.getRoot());
}
重构到这一步,其实CustomAdapter已经不明准备表达他的功能了
改名为ShadowAdapter。起名意境来自于黑泽明导演的《影武者》,顾名思义ShadowAdapter,并不需要让应用层很明显的感受到他的存在。他只要默默干活就行,他把耦合自己吃掉做好一个合格的中间商,留下更干净View和ViewModel public class ShadowAdapter<T> extends RecyclerView.Adapter<ShadowAdapter.ViewHolder>
前言
在学习RecyclerView的过程中也看到了一些对RecyclerView改造MVVM的第三方控件。但是上来直接拿来用而不做深入学习我这里是坚决反对的。自己动手一步步改造,也能加速对这个控件的理解。
Step1:MVVM的整合
首先回到我们的ViewModel
我们为我们的SearchActivity配上他的灵魂伴侣
数据集对象有了,但是怎么把ViewModel的StringItems和View层的RecyclerView产生关联那?
答案是我们的自定义属性,RecyclerView不给我们提供itemsSource我们就自己造一个,这个起名让学习过WPF的同学产生强烈的代入感。
这里有个巨坑,BindingAdapter的属性命名必须小写开头,如果完全用情怀“ItemsSource”是行不通的。作为知识点需要牢记。
回到activity_search.xml
增加绑定变量datacontext,一样一样,情怀
recyclerview上加上itemsSource的绑定
最后是SearchActivity部分完成View层和ViewModel层的装配
第一步改造完成
Step 2 数据泛型化改造
BindingAdapter还有很大的缺陷,目前我只能支持String的列表,难道我一个数据类型配一个BindingAdapter和一个RecyclerView的
Adapter。需要继续改
CustomAdapter改成泛型类,如上。只是
binding.setContent( (String)this.mDataSet.get(position));
这行代码非常的扎眼,先过。
BindingAdapter也改成可以传泛型的List。
代码抽象度一下上了一层,泛型化改造完成
未完待续~~~~
Step 3 ItemTemplate的实现
数据泛型完成了,CustomAdapter还有两处扎眼的地方
TextRowItemBinding binding = DataBindingUtil.inflate(inflater,R.layout.text_row_item,parent, false );
binding.setContent( (String)this.mDataSet.get(position));
也就是说我Item呈现的View现在还是写死的,我往View传递的数据也是死的。
RecyclerView还看不到ItemTemplate的实现,我试试看能不能加上来实现Item的View的可配置化
首先定义ItemTemplate
VariableId是代表数据项模板的绑定变量Id,就是在比如xml定义如下
最终在Java 的generated里面生成BR绑定常量
这里所有定义的绑定变量和绑定字段都会在BR类中
TemplateId就是数据项布局资源
在CustomAdapter类中增加ItemTemplate 变量,并在构造中传入
onCreateViewHolder的时候可以动态获取View及View对应的Binding了
onBindViewHolder的时候动态传入绑定数据
BindingAdapter改造,增加itemTemplate参数。
RecyclerView的绑定修改如下
这里留一个大尾巴以后解决,我在绑定表达式里面直接用BR.datacontext的话编译无法通过
猜测里面有循环使用的可能,我不能在绑定表达式中使用绑定常量,可能这是一种非法使用,具体等明天再想办法解决了
Step 4 ItemTemplate的收尾
改造的思路是走反射和默认参数的路子
如果不传入变量名字符串,则默认为datacontext
如果变量自定义,则需要传入variableName,通过反射的方式获取,绑定模块默认生成代码定义的变量id
View层改成这样,基本比较满意了
Step 5 名副其实的Adpter
重构到这一步,其实CustomAdapter已经不明准备表达他的功能了
改名为ShadowAdapter。起名意境来自于黑泽明导演的《影武者》,顾名思义ShadowAdapter,并不需要让应用层很明显的感受到他的存在。他只要默默干活就行,他把耦合自己吃掉做好一个合格的中间商,留下更干净View和ViewModel
public class ShadowAdapter<T> extends RecyclerView.Adapter<ShadowAdapter.ViewHolder>
埋坑
还剩下一部分问题未得到妥善解决
ViewModel的集合对象整个替换怎么解决
集合发生变化了怎么解决
这一篇里都没解决,目前的功能就是一次性的列表绑定
所有这些问题留在下篇博客解决
Android 练手之旅——RecyclerView(三)
The text was updated successfully, but these errors were encountered: