Android 定制万能Adapter

  • 不使用万能Adapter的开发流程
    • 开发步骤为:
      • Animal.java
      • AnimalAdapter.java
      • MainActivity.java
  • 使用万能Adapter
      • ViewHolder
      • CommenAdapter

不使用万能Adapter的开发流程

例如需要添加一个ListView控件,在这个控件中存在图片和文本框布局
Android 定制万能Adapter_第1张图片

开发步骤为:

  • 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;    }    @Overridepublic 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类对以下代码进行提取
 @Overridepublic 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);}

更多相关文章

  1. Android简单文件浏览器源代码
  2. 多个控件跑马灯效果
  3. Android 日期时间选择控件
  4. eclipse中Android布局的基本操作
  5. Android自学笔记之Android常见命令操作及一些普通布局属性
  6. Android Material Design 控件常用的属性
  7. Android共有五种布局方式
  8. Android布局_View属性
  9. Android利用setLayoutParams在代码中调整布局(Margin和居中)

随机推荐

  1. 移植rtmpdump(librtmp)到android
  2. Java/Android引用类型及其使用分析
  3. Android保存图片到系统相册
  4. org.json.JSONException: End of input a
  5. Android之——原生分享功能
  6. Android(安卓)ScrollView包裹EditText 软
  7. android短信服务
  8. 获取应用签名
  9. Android切换主线程更新UI方法总结
  10. Android获取Mac地址,支持android Q