一、首先来看RecycleView。
1、BaseViewHolder的封装
/**
* Created by zhenquan on 2017/4/28.
*/
public class BaseViewHolder <T extends ViewDataBinding> extends RecyclerView.ViewHolder{
private T dataBing;
public BaseViewHolder(View itemView) {
super(itemView);
}
public T getDataBing() {
return dataBing;
}
public void setDataBing(T dataBing) {
this.dataBing = dataBing;
}
}
2、BaseRecycleViewAdapter的封装
/**
* Created by zhenquan on 2017/4/28.
*/
public class BaseRecycleViewAdapter <T,K extends ViewDataBinding> extends RecyclerView.Adapter<BaseViewHolder<K>>{
protected List<T> lists; //数据源
protected int resouceId; //布局ID
protected int variableId; //布局内VariableId
public BaseRecycleViewAdapter(List<T> lists, int resouceId,int variableId) {
this.lists = lists;
this.resouceId = resouceId;
this.variableId = variableId;
}
/**
* 创建绑定数据的ViewHolder(实际上就相当于初始化出来界面)
* @param parent
* @param viewType
* @return
*/
@Override
public BaseViewHolder<K> onCreateViewHolder(ViewGroup parent, int viewType){
K itemBing = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()),resouceId,parent,false); //获取DataBing相当于获取View
BaseViewHolder<K> holder = new BaseViewHolder<K>(itemBing.getRoot());//初始化ViewHolder存放View
holder.setDataBing(itemBing);
return holder;
}
@Override
public void onBindViewHolder(final BaseViewHolder<K> holder, final int position){
T data = lists.get(position);//获取数据
holder.getDataBing().setVariable(variableId,data);//赋值
if(listener!=null) {//设置单击事件
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
listener.onItemClick(holder.getDataBing(),position);
}
});
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
listener.onLongItemClick(holder.getDataBing(),position);
return false;
}
});
}
holder.getDataBing().executePendingBindings();//刷新界面
}
@Override
public int getItemCount() {
return lists == null?0:lists.size();
}
/**
* TODO: 对RecyclerView的数据更新,必须remove掉Item以及DataItem,这样才会触发item改变的动画,如果直接调用notifyDataSetChanged则不会触发动画的效果
*/
/**
* 插入Item,并且更新界面
* @param t
* @param position
*/
public void addItem(T t , int position){
if(lists == null){
lists = new ArrayList<>();
}
if(position == -1){
position = lists.size();
}
lists.add(position,t);
notifyItemInserted(position);
}
public void addItem(T t){
addItem(t,-1);
}
/**
* 添加Items
* @param ts
* @param position
*/
public void addItems(List<T> ts,int position){
if(lists == null){
lists = new ArrayList<>();
}
if(position == -1){
position = lists.size();
}
lists.addAll(position,ts);
notifyItemInserted(position);
}
public void addItems(List<T> ts){
addItems(ts,-1);
}
/**
* remove Item
* @param t
*/
public void removeItem(T t){
if(lists == null){
notifyDataSetChanged();
return ;
}
int position = lists.indexOf(t);
if(position != -1) {
lists.remove(t);
notifyItemRemoved(position);
}
}
public void removeItem(int position){
if(lists == null){
notifyDataSetChanged();
return ;
}
if(position>=0 && position<lists.size()) {
lists.remove(position);
notifyItemRemoved(position);
}
}
//自定义item单击事件
protected OnItemClickListener listener;
public void setListener(OnItemClickListener listener) {
this.listener = listener;
}
public interface OnItemClickListener{
public void onItemClick(ViewDataBinding dataBinding, int position);
public void onLongItemClick(ViewDataBinding dataBinding,int position);
}
}
3、使用
recycleView.setLayoutManager(new LinearLayoutManager(mContext,LinearLayoutManager.VERTICAL,false));
recycleView.setHasFixedSize(true);
mPlistBeanViewDataBindingBaseRecycleViewAdapter = new BaseRecycleViewAdapter<>(mData, R.layout.etlist_item, BR.expertInfo); //三个参数:数据集合,条目布局文件,BR中对应的id
recycleView.setAdapter(mPlistBeanViewDataBindingBaseRecycleViewAdapter);
二、Listiew的BaseAdapter抽取
1、BaseListAdapter抽取
/**
* Created by zhenquan on 2017/4/24.
*/
public class BaseListAdapter<T> extends BaseAdapter {
private Context context;
private LayoutInflater inflater;
private int layoutId;
private int variableId;
private List<T> list;
public BaseListAdapter(Context context, int layoutId, List<T> list, int resId) {
this.context = context;
this.layoutId = layoutId;
this.list = list;
this.variableId = resId;
inflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return 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) {
ViewDataBinding dataBinding;
if (convertView == null) {
dataBinding = DataBindingUtil.inflate(inflater, layoutId, parent, false);
}else{
dataBinding = DataBindingUtil.getBinding(convertView);
}
dataBinding.setVariable(variableId, list.get(position));
return dataBinding.getRoot();
}
}
2、使用
listAdapter = new BaseListAdapter(mContext, R.layout.etlist_item, mData, BR.expertInfo);
mListEtlist.setAdapter(listAdapter);
有了这几个类,再做DataBinding中的条目展示是不是就很easy了呢~后面我们就只需要关注modle层和view层之间的互动就可以了。可以参考http://blog.csdn.net/u012702547/article/details/52077515
网友评论