android通用适配器的封装

Android开发的小伙伴们,肯定会知道一个项目下来写几十个适配器都是普普通通的事情,但是这几十个适配器有很多还是相同的代码所以这就有点蛋疼了,将许多的时间都浪费在了写同样代码的事情上,这无疑不仅是对时间的一个浪费还会导致项目代码的冗余,从而增加维护成本。。鉴于此,通用适配器这一名词就出现在了人们的视线中,我也是近期才去考虑做这些事情找了一些资料再加上一些自己的想法写了一个通用的适配器,仅供大家参考,网上有好多写好的万能适配器但是我发现网上的那些都没有对按钮的监听进行处理,我这里加上了对按钮监听的处理,如果大家有什么更好的实现方式欢迎留言指导。。。下面直接上代码


**
 * Created by Administrator on 2017/7/10.
 */

public abstract class CommonAdapter<T> extends BaseAdapter {

    protected LayoutInflater mInflater;
    protected static Context mContext;
    protected List<T> mDatas;
    protected final int mItemLayoutId;

    public CommonAdapter(Context context, List<T> mDatas,int itemLayoutId) {
        mInflater = LayoutInflater.from(context);
        this.mContext = context;
        this.mDatas = mDatas;
        this.mItemLayoutId = itemLayoutId;
    }

    @Override
    public int getCount() {
        return mDatas.size();
    }

    @Override
    public Object getItem(int position) {
        return mDatas.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final ViewHolder viewHolder = getViewHolder(position, convertView,
                parent);
        convert(viewHolder, (T) getItem(position));
        return viewHolder.getConvertView();

    }

    public abstract void convert(ViewHolder helper, T item);



    private ViewHolder getViewHolder(int position, View convertView,
                                     ViewGroup parent) {
        return ViewHolder.get(mContext, convertView, parent, mItemLayoutId,
                position);
    }

        public static class ViewHolder {
            private final SparseArray<View> mViews;
            private int mPosition;
            private View mConvertView;
            private OnClickListener mOnItemChangedListener;
            private ViewHolder(Context context, ViewGroup parent, int layoutId,
                               int position) {
                this.mPosition = position;
                this.mViews = new SparseArray<View>();
                mConvertView = LayoutInflater.from(context).inflate(layoutId, parent,
                        false);
                // setTag
                mConvertView.setTag(this);
            }

            /**
             * 拿到一个ViewHolder对象
             *
             * @param context
             * @param convertView
             * @param parent
             * @param layoutId
             * @param position
             * @return
             */
            public static ViewHolder get(Context context, View convertView,
                                  ViewGroup parent, int layoutId, int position) {
                if (convertView == null) {
                    return new ViewHolder(context, parent, layoutId, position);
                }
                return (ViewHolder) convertView.getTag();
            }

            public View getConvertView() {
                return mConvertView;
            }

            /**
             * 通过控件的Id获取对于的控件,如果没有则加入views
             *
             * @param viewId
             * @return
             */
            public <T extends View> T getView(int viewId) {
                View view = mViews.get(viewId);
                if (view == null) {
                    view = mConvertView.findViewById(viewId);
                    mViews.put(viewId, view);
                }
                return (T) view;
            }

            /**
             * 为TextView设置字符串
             *
             * @param viewId
             * @param text
             * @return
             */
            public ViewHolder setText(int viewId, String text) {
                TextView view = getView(viewId);
                view.setText(text);
                return this;
            }

            /**
             * 为ImageView设置图片
             *
             * @param viewId
             * @param drawableId
             * @return
             */
            public ViewHolder setImageResource(int viewId, int drawableId) {
                ImageView view = getView(viewId);
                view.setImageResource(drawableId);

                return this;
            }

            /**
             * 为ImageView设置图片
             *
             * @param viewId
             * @return
             * @paramdrawableId
             */
            public ViewHolder setImageBitmap(int viewId, Bitmap bm) {
                ImageView view = getView(viewId);
                view.setImageBitmap(bm);
                return this;
            }

            /**
             * 为ImageView设置图片
             *
             * @param viewId
             * @return
             * @paramdrawableId
             */
            public ViewHolder setImageByUrl(int viewId, String url) {
//                ImageLoader.getInstance(3, Type.LIFO).loadImage(url,
//                        (ImageView) getView(viewId));
                Glide.with(mContext).load(url).into((ImageView) getView(viewId));
                return this;
            }

            /**
             * 为按钮设置监听
             * @return
             */
            public ViewHolder setOnClickBtn(Button viewId){
                viewId.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {

                    }
                });
                return this;
            }

            /**
             * 设置监听 这是对图片监听的设置(换成按钮是一样的逻辑代码)
             * @return
             */
            public ViewHolder setOnClickImg(int viewId, View.OnClickListener onClickListener){
                ImageView view = getView(viewId);
                view.setOnClickListener(onClickListener);
                return this;
            }

            // 自定义接口
            public interface OnClickListener {
                void onClick(View view);
            }

            // 对外提供方法
            public void setOnClickListener(
                    OnClickListener listener) {
                this.mOnItemChangedListener = listener;
            }

            public int getPosition() {
                return mPosition;
            }

        }
    }



至此,我们的适配器就封装完了,相信大家都能看懂这里不做过多解释。。

下面看具体的使用:

在Activity中:

emp_listview.setAdapter(adapter = new CommonAdapter<String>(EmpAddressActivity.this, list, R.layout.emplist_item) {
    @Override
    public void convert(ViewHolder helper, String item) {
        helper.setText(R.id.emp_name, item);
        helper.setOnClickImg(R.id.emp_message, new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Util.MyToast(EmpAddressActivity.this, "点击发送消息");
                Uri uri2 = Uri.parse("smsto:"+10086);
                Intent intentMessage = new Intent(Intent.ACTION_VIEW,uri2);
                startActivity(intentMessage);
            }
        });
    }
});

扫描二维码关注公众号,回复: 2141779 查看本文章

我这里实现的是点击图片按钮进行发送短信的操作,不管什么逻辑这个通用适配器的使用都是一样的。。。

android渣渣一直在努力希望大家能够给出宝贵的意见建议。。。








猜你喜欢

转载自blog.csdn.net/zhourui_1021/article/details/74944006