Android 基础类集锦

1,838 阅读2分钟

#前言
目前总结了四个基础类 分别是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);
        }
    }
}

本文代码地址