#前言
目前总结了四个基础类 分别是BaseActivity,BaseDialog,SuperBaseAdapter,SuperBaseBindingAdapter;最近发现使用基础类真的可以简化工作;以后准备持续总结; 这个四个类主要是简化databing使用;
#BaseActivity
public abstract class BaseActivity extends AppCompatActivity {
private ViewDataBinding binding;
protected abstract int getLayoutId();
protected abstract void initBinding(ViewDataBinding binding);
protected abstract void initPresenter();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this,getLayoutId());
initBinding(binding);
}
@CallSuper
@Override
protected void onResume() {
initPresenter();
super.onResume();
}
@CallSuper
@Override
protected void onDestroy() {
super.onDestroy();
}
}
#BaseDialog
public abstract class BaseDialog extends Dialog implements Dialog.OnDismissListener{
private Context mContext;
private ViewDataBinding binding;
public BaseDialog(Context context) {
super(context);
mContext = context;
}
public BaseDialog(Context context, int themeResId) {
super(context, themeResId);
mContext = context;
}
protected BaseDialog(Context context, boolean cancelable, OnCancelListener cancelListener) {
super(context, cancelable, cancelListener);
mContext = context;
}
protected abstract int getLayoutId();
protected abstract void initBinding(ViewDataBinding binding);
protected abstract void initInfo(Object... objects);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.inflate(LayoutInflater.from(mContext),getLayoutId(),null,false);
setContentView(binding.getRoot());
}
@Override
protected void onStart() {
super.onStart();
setOnDismissListener(this);
}
public void showDialog(){
if(isShowing())return;
show();
}
public void closeDialog(){
if(!isShowing())return;
dismiss();
}
}
#SuperBaseBindingAdapter
这个主要是推荐,上一个还要自己实现viewholder,使用databing的形式可以不实现viewholder,只要实现Databing就好了
public abstract class SuperBaseBindingAdapter extends BaseAdapter {
protected final Context context;
protected final LayoutInflater mLayoutInflater;
protected List dataList = new ArrayList<>();
public SuperBaseBindingAdapter(Context context, List dataList) {
this.context = context;
if (null != dataList && !dataList.isEmpty()) {
this.dataList.clear();
this.dataList.addAll(dataList);
}
mLayoutInflater = LayoutInflater.from(this.context);
}
@Override
public int getCount() {
return dataList == null ? 0 : dataList.size();
}
@Override
public T getItem(int position) {
return dataList == null ? null : dataList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHelper viewHelper = new ViewHelper(mLayoutInflater, convertView, parent).invoke();
convertView = viewHelper.getConvertView();
T item = getItem(position);
ViewDataBinding mBinding = viewHelper.getViewBinding();
setItemData(position, item, mBinding);
return convertView;
}
public void setData(List dataList) {
if (null != dataList && !dataList.isEmpty()) {
this.dataList = null;
this.dataList = new ArrayList<>(dataList);
}
}
/**
* 获取 item layout ResId
*
* @return int item layout resid
*/
public abstract int getItemLayoutResId();
/**
* 设置item数据
*/
public abstract void setItemData(@Nullable final int position,@Nullable final T dataItem,@Nullable final ViewDataBinding binding);
/**
* 实现中间环节的调用辅助类
*/
private class ViewHelper {
private View convertView;
private ViewGroup viewGroup;
private ViewDataBinding mBinding;
private LayoutInflater inflater;
public ViewHelper(LayoutInflater inflater, View convertView, ViewGroup viewGroup) {
this.convertView = convertView;
this.viewGroup = viewGroup;
this.inflater = inflater;
}
public View getConvertView() {
return convertView;
}
public ViewDataBinding getViewBinding() {
return mBinding;
}
public ViewHelper invoke() {
//covertView 复用的逻辑在这里呢 再也不用一遍一遍的写这个逻辑了
if (convertView == null) {
//新建 convertView
mBinding = DataBindingUtil.inflate(inflater, getItemLayoutResId(), viewGroup, false);
convertView = mBinding.getRoot();
convertView.setTag(mBinding);
} else {
//复用 convertView
mBinding = (ViewDataBinding) convertView.getTag();
}
return this;
}
}
}
#SuperBaseAdapter
这个需要自己实现Viewholder,这个是在简书上一个大神写的 www.jianshu.com/p/ba74960e3…
public abstract class SuperBaseAdapter extends BaseAdapter {
protected final Context context;
protected final LayoutInflater mLayoutInflater;
protected List dataList = new ArrayList<>();
public SuperBaseAdapter(Context context, List dataList) {
this.context = context;
if (null != dataList && !dataList.isEmpty()) {
this.dataList.clear();
this.dataList.addAll(dataList);
}
mLayoutInflater = LayoutInflater.from(this.context);
}
@Override
public int getCount() {
return dataList == null ? 0 : dataList.size();
}
@Override
public T getItem(int position) {
return dataList == null ? null : dataList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHelper viewHelper = new ViewHelper(convertView, parent).invoke();
convertView = viewHelper.getConvertView();
T item = getItem(position);
Object holder = viewHelper.getHolder();
setItemData(position,item, holder);
return convertView;
}
public void setData(List dataList) {
if (null != dataList && !dataList.isEmpty()) {
this.dataList.clear();
this.dataList.addAll(dataList);
}
}
/**
* 获取 item layout ResId
*
* @return int item layout resid
*/
public abstract int getItemLayoutResId();
/**
* 获取 ViewHolder ViewHolder自身实现初始化
*
* @param rootView
* @return
*/
public abstract Object getViewHolder(View rootView);
/**
* 设置item数据
* @param position
* @param dataItem
* @param viewHolder
*/
public abstract void setItemData(final int position,final T dataItem, final Object viewHolder);
/**
* 实现中间环节的调用辅助类
*/
private class ViewHelper {
private View convertView;
private ViewGroup viewGroup;
private Object holder;
public ViewHelper(View convertView, ViewGroup viewGroup) {
this.convertView = convertView;
this.viewGroup = viewGroup;
}
public View getConvertView() {
return convertView;
}
public Object getHolder() {
return holder;
}
public ViewHelper invoke() {
//covertView 复用的逻辑在这里呢 再也不用一遍一遍的写这个逻辑了
if (convertView == null) {
//新建 convertView
convertView = mLayoutInflater.inflate(getItemLayoutResId(), viewGroup, false);
holder = getViewHolder(convertView);
convertView.setTag(holder);
} else {
//复用 convertView
holder = convertView.getTag();
}
return this;
}
}
}
具体实现
public class DemoAdapter extends SuperBaseAdapter {
public DemoAdapter(Activity context, List list) {
super(context, list);
}
@Override
public int getItemLayoutResId() {
return R.layout.item_group_list;
}
@Override
public Object getViewHolder(View rootView) {
//返回自己的 ViewHolder对象
return new ViewHolder(rootView);
}
@Override
public void setItemData(final int position, final Object dataItem, final Object viewHolder) {
GroupModel groupModel = (GroupModel) dataItem;
//将holder 转为自己holder
ViewHolder myHolder = (ViewHolder) viewHolder;
myHolder.tv_group_name.setText(TextUtils.isEmpty(groupModel.getContactName()) ? "" : groupModel.getContactName());
//ImageLoadUtils.loadImage(myHolder.iv_group_avatar, groupModel.getHeadUrl());
myHolder.iv_group_no_disturb.setVisibility(groupModel.getIsDisturb() == 1 ? View.VISIBLE : View.GONE);
}
/**
* ViewHolder 通过构造方法中 实现具体view的绑定的方式 创建一个自实现绑定View的ViewHolder
* Created by bailiangjin on 16/7/5.
*/
public static class ViewHolder {
public final View root;
public final ImageView iv_group_avatar;
public final ImageView iv_group_no_disturb;
public final TextView tv_group_name;
public ViewHolder(View root) {
this.root = root;
this.iv_group_avatar = (ImageView) this.root.findViewById(R.id.iv_group_avatar);
this.iv_group_no_disturb = (ImageView) this.root.findViewById(R.id.iv_group_no_disturb);
this.tv_group_name = (TextView) this.root.findViewById(R.id.tv_group_name);
}
}
}