需要在app目录下得的buildgradle文件中加上在android{}内部加上
dataBinding { enabled true }
然后在引入依赖的文件
compile 'com.android.support:recyclerview-v7:25.3.1' compile "com.liangfeizc:avatarview:0.0.1@aar" compile 'com.github.bumptech.glide:glide:3.7.0'
其中compile "com.liangfeizc:avatarview:0.0.1@aar"是在网上找的自定义的原型的图片。
2.下面介绍绑定的过程,既然是绑定那么,在xml 文件中首先绑定数据的来原
name="rvAdapter"
type="com.cnlive.granzon.ui.adapter.RVAdapter" />
其中name的名字随便起只要在代码中关联一直就行,我认为其实这个名字就是在代码中设置数据的时候保持一直比如说我在这里是rvAdapter那么我在设置数据的时候就会用到
fragmentChatroomBinding.setRvAdapter(new RVAdapter(getContext(), list2, R.layout.receycel_item_view, BR.user));
上面的方法,即setRvAdapter方法设置数据,
再看设置recelView与vriable设置关联
android:id="@+id/recyclerView"
android:layout_toLeftOf="@id/people_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:adapter="@{rvAdapter}"
app:layoutManager="@{rvLayoutManager}" />
其中app:adapter就是和上面的name="rvAdapter" 设置关联, 而 app:layoutManager就是说他的类型,是gradal 还是linear, 也是在代码中设置,同样方法也是对应的
下面看实际的代码
先看
@Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { fragmentChatroomBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_chatroom, container, false); return fragmentChatroomBinding.getRoot(); }
在activity 和fragment中绑定xml文件的方法不一样,上面是fragment中的绑定的方法,
fragmentChatroomBinding.setRvLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false)); fragmentChatroomBinding.setRvAdapter(new RVAdapter(getContext(), list2, R.layout.receycel_item_view, BR.user));
第一个方法就是设置他的类型,第二个方法就是他的数据绑定,
第二个方法中其中R.layout.receycel_item_view是实际的每一项的xml 文件, 后面的BR.user是每一项中的数据依赖的user
来看一下
xml version="1.0" encoding="utf-8"?>xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools"> name="user" type="com.cnlive.granzon.model.User" /> android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="5dp" android:orientation="horizontal"> android:layout_width="20dp" android:layout_height="20dp" app:imageUrl="@{user.icon}" />
其实逻辑是和上面讲的一样的重点看一下RVAdapter
public class RVAdapter extends RecyclerView.Adapter{ private Context mContext; private List mDataList; private int mLayoutId; // 条目布局文件ID private int mVariableId; // DataBinding变量ID public RVAdapter(Context context, List list, int layoutId, int variableId) { this.mContext = context; this.mDataList = list; this.mLayoutId = layoutId; mVariableId = variableId; } @Override public RVHolder onCreateViewHolder(ViewGroup parent, int viewType) { ViewDataBinding binding = DataBindingUtil.inflate(LayoutInflater.from(mContext), mLayoutId, parent, false); RVHolder holder = new RVHolder(binding.getRoot()); holder.binding = binding; return holder; } @Override public void onBindViewHolder(RVHolder holder, int position) { holder.binding.setVariable(mVariableId, mDataList.get(position)); // 别忘记这句代码 holder.binding.executePendingBindings(); } @Override public int getItemCount() { return mDataList == null ? 0 :mDataList.size(); } class RVHolder extends RecyclerView.ViewHolder { ViewDataBinding binding; RVHolder(View view) { super(view); } } }
只需要把代码复制一下就可以了,其实逻辑很简单 先把xml 文件绑定,后来再把数据绑定这样就可以实现了,还有最容易忘记的代码
你会想图片加载的方法呢,别急,采用注解的方式
@BindingAdapter({"imageUrl"}) public static void loadImage(ImageView imageView, String url) { if (url == null) { imageView.setImageResource(R.mipmap.ic_launcher); } else { Glide.with(imageView.getContext()).load(url).error(R.mipmap.ic_launcher).into(imageView); } }
其中xml文件中的imageUrl和这里的注解的名字是一样的。下面主要讲的就是上面的方法,后续会把代码地址贴出来