Android 定制万能Adapter
16lz
2021-01-23
Android 定制万能Adapter
- 不使用万能Adapter的开发流程
- 开发步骤为:
- Animal.java
- AnimalAdapter.java
- MainActivity.java
- 使用万能Adapter
- ViewHolder
- CommenAdapter
不使用万能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; } @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);}
更多相关文章
- Android简单文件浏览器源代码
- 多个控件跑马灯效果
- Android 日期时间选择控件
- eclipse中Android布局的基本操作
- Android自学笔记之Android常见命令操作及一些普通布局属性
- Android Material Design 控件常用的属性
- Android共有五种布局方式
- Android布局_View属性
- Android利用setLayoutParams在代码中调整布局(Margin和居中)