zoukankan      html  css  js  c++  java
  • 3-VI--☆ListView的封装

    零、前言

    [1].第一次自己ListView封装时,封装的比较差,用起来不是很好用,虽然比起原生好很多
    [2].第二次接触ListView封装是在慕课网hyman的课程,深深折服
    [3].基于此思想,自己封装了RecyclerView


    一、使用

    1.使用起来只要两步
    public class Up3Activity extends AppCompatActivity {
    
        @BindView(R.id.lv)
        ListView mLv;
        private ArrayList<String> mNames;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            ButterKnife.bind(this);
            mNames = DataUtils.getRandomName(200000, true);
            mLv.setAdapter(new MyLVAdapter<String>(this, mNames, R.layout.item_array_with_img) {
                @Override
                public void setData(MyLVHolder holder, String data, int position) {
                    holder.setText(R.id.tv_content, data);
                }
            });
        }
    }
    
    9414344-69f9f586db09312b.png
    listview封装.png

    二、封装过程:
    1. MyLVHolder类
    /**
     * 作者:张风捷特烈
     * 时间:2018/4/6:11:30
     * 邮箱:1981462002@qq.com
     * 说明:MyLVHolder
     */
    public class MyLVHolder {
    
        /**
         * 条目内部控件的view集合
         */
        private SparseArray<View> mViews;
        /**
         * 位置
         */
        private int mPosition;
        /**
         * 条目视图
         */
        private View mItemView;
        private List<Integer> mPos;
    
        /**
         * @param ctx      上下文
         * @param parent   parent
         * @param layoutId 布局ID
         * @param position 位置
         */
        public MyLVHolder(Context ctx, ViewGroup parent, int layoutId, int position) {
            mPosition = position;
            mViews = new SparseArray<>();
            //生成条目的View
            mItemView = LayoutInflater.from(ctx).inflate(layoutId, parent, false);
            //用MyLVHolder为条目View设置标签
            mItemView.setTag(this);
        }
    
        /**
         * 获取 MyLVHolder 对象
         *
         * @param ctx         上下文
         * @param convertView convertView
         * @param parent      parent
         * @param layoutId    布局ID
         * @param position    位置
         * @return MyLVHolder 对象
         */
        public static MyLVHolder get(Context ctx, View convertView, ViewGroup parent, int layoutId, int position) {
            //convertView为空
            if (convertView == null) {
                //创建MyLVHolder对象
                return new MyLVHolder(ctx, parent, layoutId, position);
            } else {
                //复用MyLVHolder
                MyLVHolder holder = (MyLVHolder) convertView.getTag();
                holder.mPosition = position;//更新position
                return holder;
            }
        }
    
        public List<Integer> handleCheckBox(int checkBoxId) {
            mPos = new ArrayList<>();
            final CheckBox cb = this.getView(checkBoxId);
            cb.setChecked(false);
            if (mPos.contains(this.getPosition())) {
                cb.setChecked(true);
            }
            cb.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (cb.isChecked()) {
                        mPos.add(getPosition());
                    } else {
                        mPos.remove((Integer) getPosition());
                    }
                }
            });
            return mPos;//返回选中的CheckBox位置集合
        }
    
    
        public View getItemView() {
            return mItemView;
        }
    
        /**
         * 通过viewId获取控件
         *
         * @param viewId 条目内部控件的id
         * @param <T>    数据泛型
         * @return view
         */
        public <T extends View> T getView(int viewId) {
            //通过viewId为键获取View值
            View view = mViews.get(viewId);
            //如果view为空
            if (view == null) {
                //条目findViewById获取View
                view = mItemView.findViewById(viewId);
                //以id为键,View为值存入mViews集合
                mViews.put(viewId, view);
            }
            return (T) view;
        }
    
        public View getConvertView() {
            return mItemView;
        }
    
        public int getPosition() {
            return mPosition;
        }
    
        /**
         * 设置TextView文本方法
         *
         * @param viewId 条目内部控件的id
         * @param text 文本
         * @return MyLVHolder对象
         */
        public MyLVHolder setText(int viewId, String text) {
            TextView view = getView(viewId);
            view.setText(text);
            return this;
        }
    
        /**
         * 通过id设置图片
         * @param viewId 条目内部控件的id
         * @param resId 资源id
         * @return MyLVHolder对象
         */
        public MyLVHolder setImageViewRes(int viewId, int resId) {
            ImageView view = getView(viewId);
            view.setImageResource(resId);
            return this;
        }
    
        /**
         * 通过id设置图片
         * @param viewId 条目内部控件的id
         * @param bitmap 图片
         * @return MyLVHolder对象
         */
        public MyLVHolder setImageViewBitmap(int viewId, Bitmap bitmap) {
            ImageView view = getView(viewId);
            view.setImageBitmap(bitmap);
            return this;
        }
    }
    
    2.适配器类:MyLVAdapter
    /**
     * 作者:张风捷特烈
     * 时间:2018/4/6:13:51
     * 邮箱:1981462002@qq.com
     * 说明:ListView适配器
     */
    public abstract class MyLVAdapter<T> extends BaseAdapter {
        /**
         * 数据
         */
        protected List<T> mDatas;
        /**
         * 布局ID
         */
        protected int mLayoutId;
        /**
         * 上下文
         */
        protected Context mCtx;
    
    
        public MyLVAdapter(Context ctx, List<T> datas, int listId) {
            mCtx = ctx;
            mDatas = datas;
            mLayoutId = listId;
        }
    
        @Override
        public int getCount() {
            return mDatas.size();
        }
    
        @Override
        public T 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) {
            //创建 MyLVHolder 对象
            MyLVHolder holder = MyLVHolder.get(mCtx, convertView, parent, mLayoutId, position);
            setData(holder, getItem(position), position);
            return holder.getConvertView();
        }
    
        /**
         * 设置数据抽象方法
         * @param holder MyLVHolder
         * @param data 数据
         * @param position 位置
         */
        public abstract void setData(MyLVHolder holder, T data, int position);
    
    }
    

    附录、布局:

    activity_main.xml
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <ListView
            android:id="@+id/lv"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fastScrollEnabled="true">
        </ListView>
    </LinearLayout>
    
    
    layout/item_array_with_img.xml
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:padding="10dp">
    
        <ImageView
            android:id="@+id/iv_icon"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@mipmap/ic_launcher"/>
        <TextView
            android:id="@+id/tv_title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            android:textSize="18sp"
            android:textColor="#000"
            android:layout_toRightOf="@+id/iv_icon"
            android:text=""/>
    </RelativeLayout>
    

    后记、

    1.声明:

    [1]本文由张风捷特烈原创,转载请注明
    [2]欢迎广大编程爱好者共同交流
    [3]个人能力有限,如有不正之处欢迎大家批评指证,必定虚心改正
    [4]你的喜欢与支持将是我最大的动力

    2.连接传送门:

    更多安卓技术欢迎访问:安卓技术栈
    我的github地址:欢迎star
    简书首发,腾讯云+社区同步更新
    张风捷特烈个人网站,编程笔记请访问:http://www.toly1994.com

    3.联系我

    QQ:1981462002
    邮箱:1981462002@qq.com
    微信:zdl1994328

    4.欢迎关注我的微信公众号,最新精彩文章,及时送达:
    9414344-c474349cd3bd4b82.jpg
    公众号.jpg
  • 相关阅读:
    SharePoint 2010 + Infopath 2010 VSTA + WF + Timer Job + BI 之 报销单实例系列创建报销单新增视图
    读取 SPFieldChoice 选项类型的三种方法 ,第三种方法目前有问题没有解决,请高手来解决一下
    Ubuntu SVN安装
    Hibernate注解使用以及Spring整合
    性能大提速 MyEclipse终极优化四要点
    MyEclipse运行错误解决办法:The Linux WYSIWYG design panel is still under development
    详细介绍Ubuntu VirtualBox的桥接网络配置
    Log4Net使用指南
    MyEclipse Java Build Path详解
    JSTL 核心标签库 使用
  • 原文地址:https://www.cnblogs.com/toly-top/p/9781930.html
Copyright © 2011-2022 走看看