zoukankan      html  css  js  c++  java
  • Android 定制万能Adapter

    不使用万能Adapter的开发流程

    例如需要添加一个ListView控件,在这个控件中存在图片和文本框布局
    在这里插入图片描述

    开发步骤为:

    • 1、编写ListView中每一个子项的布局文件list_view_item.xml
    • 2、编写一个实体类Animal.java
    • 3、编写一个Adapter继承BaseAdapter
    • 4、编写MainAcitivity.java

    Animal.java

    public class Animal {
        private String aName;
        private String aSpeak;
        private int aIcon;
    
        public Animal() {
        }
    
        public Animal(String aName, String aSpeak, int aIcon) {
            this.aName = aName;
            this.aSpeak = aSpeak;
            this.aIcon = aIcon;
        }
    
        public String getaName() {
            return aName;
        }
    
        public String getaSpeak() {
            return aSpeak;
        }
    
        public int getaIcon() {
            return aIcon;
        }
    
        public void setaName(String aName) {
            this.aName = aName;
        }
    
        public void setaSpeak(String aSpeak) {
            this.aSpeak = aSpeak;
        }
    
        public void setaIcon(int aIcon) {
            this.aIcon = aIcon;
        }
    }
    

    AnimalAdapter.java

    public class AnimalAdapter extends BaseAdapter {
    
        private LinkedList<Animal> mData;
        private Context mContext;
    
        public AnimalAdapter(LinkedList<Animal> mData, Context mContext) {
            this.mData = mData;
            this.mContext = mContext;
        }
    
        @Override
        public int getCount() {
            return mData.size();
        }
    
        @Override
        public Object getItem(int position) {
            return null;
        }
    
        @Override
        public long getItemId(int position) {
            return position;
        }
    
        @Override
    	public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        if(convertView == null){
            convertView = LayoutInflater.from(mContext).
            inflate(R.layout.item_list_animal,parent,false);
            holder = new ViewHolder();
            holder.img_icon = (ImageView) convertView.findViewById(R.id.img_icon);
            holder.txt_aName = (TextView) convertView.findViewById(R.id.txt_aName);
            holder.txt_aSpeak = (TextView) convertView.findViewById(R.id.txt_aSpeak);
            convertView.setTag(holder);   //将Holder存储到convertView中
        }else{
            holder = (ViewHolder) convertView.getTag();
        }
        holder.img_icon.setBackgroundResource(mData.get(position).getaIcon());
        holder.txt_aName.setText(mData.get(position).getaName());
        holder.txt_aSpeak.setText(mData.get(position).getaSpeak());
        return convertView;
    }
    
    static class ViewHolder{
        ImageView img_icon;
        TextView txt_aName;
        TextView txt_aSpeak;
    	}
    }
    

    MainActivity.java

    public class MainActivity extends AppCompatActivity {
    
        private List<Animal> mData = null;
        private Context mContext;
        private AnimalAdapter mAdapter = null;
        private ListView list_animal;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mContext = MainActivity.this;
            list_animal = (ListView) findViewById(R.id.list_animal);
            mData = new LinkedList<Animal>();
            mData.add(new Animal("狗说", "你是狗么?", R.mipmap.ic_icon_dog));
            mData.add(new Animal("牛说", "你是牛么?", R.mipmap.ic_icon_cow));
            mData.add(new Animal("鸭说", "你是鸭么?", R.mipmap.ic_icon_duck));
            mData.add(new Animal("鱼说", "你是鱼么?", R.mipmap.ic_icon_fish));
            mData.add(new Animal("马说", "你是马么?", R.mipmap.ic_icon_horse));
            mAdapter = new AnimalAdapter((LinkedList<Animal>) mData, mContext);
            list_animal.setAdapter(mAdapter);
        }
    }
    

    这样就意味着如果项目需要20个ListView那么每个ListView需要重新编写实体类和各自的Adapter代码量巨大,因此可以将上述代码进行优化并提取,从而减少代码量。

    使用万能Adapter

    • 首先新建一个ViewHolder类对以下代码进行提取
     @Override
    	public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        if(convertView == null){
            convertView = LayoutInflater.from(mContext).
            inflate(R.layout.item_list_animal,parent,false);
            holder = new ViewHolder();
            holder.img_icon = (ImageView) convertView.findViewById(R.id.img_icon);
            holder.txt_aName = (TextView) convertView.findViewById(R.id.txt_aName);
            holder.txt_aSpeak = (TextView) convertView.findViewById(R.id.txt_aSpeak);
            convertView.setTag(holder);   //将Holder存储到convertView中
        }else{
            holder = (ViewHolder) convertView.getTag();
        }
        holder.img_icon.setBackgroundResource(mData.get(position).getaIcon());
        holder.txt_aName.setText(mData.get(position).getaName());
        holder.txt_aSpeak.setText(mData.get(position).getaSpeak());
        return convertView;
    }
    
    static class ViewHolder{
        ImageView img_icon;
        TextView txt_aName;
        TextView txt_aSpeak;
    	}
    

    从上面代码可以看出ViewHolder需要做两件事:

    • 1、绑定控件在这里插入图片描述
    • 2、设置控件状态在这里插入图片描述

    ViewHolder

    public class ViewHolder {
        private SparseArray<View> mViews;
        private int mPosition;
        private View mConvertView;
    
        public 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);
            mConvertView.setTag(this);
        }
    
        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;
        }
    
        public static ViewHolder get(Context context,View convertView,
                                     ViewGroup parent,int layoutId ,int position){
            if (convertView == null){
                return new ViewHolder(context,parent,layoutId,position);
            }else{
                ViewHolder holder = (ViewHolder) convertView.getTag();
                holder.mPosition = position;
                return holder;
            }
        }
    
        public View getmConvertView() {
            return mConvertView;
        }
    
        public ViewHolder setText(int viewId,String s){
            TextView textView = getView(viewId);
            textView.setText(s);
            return this;
        }
    }
    

    2、新建一个CommenAdapter对AnimalAdapter中其余的方法进行优化

    CommenAdapter

    public abstract class CommonAdapter<T> extends BaseAdapter {
    
        protected Context mContext;
        protected List<T> mDatas;
        protected LayoutInflater mInflater;
        protected int LayoutId;
    
        public CommonAdapter(Context context, List<T>datas,int layoutId){
            this.mContext = context;
            mInflater = LayoutInflater.from(context);
            this.mDatas =datas;
            this.LayoutId = layoutId;
    
        }
    
    
        @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 i, View view, ViewGroup viewGroup){
            ViewHolder holder = ViewHolder.get(mContext,view,viewGroup,LayoutId,i);
            convert(holder,getItem(i));
            return holder.getmConvertView();
        }
    
        public abstract void convert(ViewHolder holder,T t);
    }
    
  • 相关阅读:
    Python中利用函数装饰器实现备忘功能
    selenium之 定位以及切换frame(iframe)
    selenium之操作ChromeDriver
    设置跑的次数
    l类型转换错误ClassCastException
    代码提交失败
    【cl】Json学习
    mysql下载安装
    mysql登录基本语句
    linux 递归删除目录文件
  • 原文地址:https://www.cnblogs.com/PythonFCG/p/13860158.html
Copyright © 2011-2022 走看看