先看实现的布局:很简单的一个布局,这里主要是用了一下databinding的数据绑定和事件绑定
Screenshot_SmartSelect_2017-07-19-11-30-37.png
<?xml version="1.0" encoding="utf-8"?>
<layout>
<data>
<variable
name="obj"
type="com.XXXXXXXX.DataBean"/>
<variable
name="event"
type="com.XXXXXXX.ClickBinding"/>
</data>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:descendantFocusability="blocksDescendants"
android:gravity="center_vertical"
android:orientation="horizontal"
>
<TextView
android:id="@+id/title"
style="@style/text_shimingrenzheng"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toRightOf="@+id/cb_select"
android:maxEms="6"
android:singleLine="true"
android:text="@{obj.title}"
android:textSize="14sp"
/>
<TextView
style="@style/text_shimingrenzheng"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="150dp"
android:maxEms="6"
android:singleLine="true"
android:text="@{obj.nickname}"
android:textColor="#999999"
android:textSize="12sp"
/>
<LinearLayout
android:id="@+id/ll"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:gravity="center_vertical"
android:orientation="horizontal"
>
<ImageView
android:id="@+id/play_img"
android:layout_width="14dp"
android:layout_height="17dp"
android:layout_marginRight="15dp"
android:clickable="true"
android:onClick="@{(view)->event.playOnClick(view,obj)}"
android:src="@mipmap/play"
/>
<ImageView
android:id="@+id/img_dele"
android:layout_width="17dp"
android:layout_height="17dp"
android:layout_marginRight="10dp"
android:clickable="true"
android:src="@mipmap/del"
android:onClick="@{(view)->event.deleOnClick(view,obj)}"
/>
</LinearLayout>
</RelativeLayout>
</layout>
封装的adapter:
public abstract class BaseBindingAdapter<T,W extends ViewDataBinding> extends BaseAdapter {
private List<T> list;
protected Context context;
int itemId;
public BaseBindingAdapter(Context context, List<T> list, int itemId) {
this.list = list;
this.context = context;
this.itemId = itemId;
}
public BaseBindingAdapter(Context context) {
this.context = context;
}
public List<T> getList(){
return this.list;
}
public void setList(List<T> list) {
this.list = list;
notifyDataSetChanged();
}
@Override
public int getCount() {
return list == null ? 0 :list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
W w;
if(convertView == null){
convertView = View.inflate(context,itemId,null);
w = DataBindingUtil.bind(convertView);
convertView.setTag(w);
}
if (list != null && list.get(position) != null) {
w = (W) convertView.getTag();
T t = list.get(position);
bindObj(w, t);
operateView(convertView,t);
}
return convertView;
}
public abstract void bindObj(W w,T t);
public void operateView(View view, T t){
}
}
说明:
1、在布局里面绑定事件和数据:
android:text="@{obj.nickname}"
android:onClick="@{(view)->event.playOnClick(view,obj)}"
2、拓展的方法
//这里可以拿到相应位置的view和data进行其他操作
@Override
public void operateView(View view, MusicListBean.DataBean dataBean) {
super.operateView(view, dataBean);
}
用法:
1、在写好上面的布局itembinding后,构建一下,会自动生成ItemBinding类
定义全局变量:
BaseBindingAdapter<XXXXX.DataBean, ItemBinding> adapter ;
2、自定义事件,比如这里要实现点击播放和删除:
public class ClickBinding {
public void playOnClick(View view, MusicListBean.DataBean dataBean) {
//播放音乐
}
public void deleOnClick(View view, MusicListBean.DataBean dataBean) {
//删除当前条目
}
}
3、创建适配器,传入相应参数,给listView(也可以是gridview之类的)设置adapter
adapter = new BaseBindingAdapter<XXXXX.DataBean, ItemBinding>(this, selectedList, R.layout.itembinding) {
@Override
public void bindObj(ItemBinding itemBinding, MusicListBean.DataBean dataBean) {
itemBinding.setObj(dataBean);//绑定数据
itemBinding.setEvent(new ClickBinding());//绑定事件
}
}
};
listView.setAdapter(adapter);
4、更新adapter:在请求到服务器数据后:
adapter.setList(list);//list是数据源,setlist方法里面调用了notifyDataSetChanged
·········同样的,用这个adapter实现的其他布局:
Screenshot_SmartSelect_2017-07-19-11-24-25.png
image.png