ListView适配器的写法
来源:互联网 发布:ios http网络协议 编辑:程序博客网 时间:2024/04/30 05:13
初级
- 优点:复用convertView
- 缺点:每次调用getview()都会去findview,是耗费资源的操作
public class MyAdapter extends BaseAdapter { protected List<Bean> mList; protected Context mContext; LayoutInflater mInflater; public MyAdapter(Context context, List<Bean> list) { this.mList = list; this.mContext = context; mInflater=LayoutInflater.from(context); } @Override public int getCount() { return mList.size(); } @Override public Object getItem(int position) { return mList.get(position); } @Override public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { /*----------视图操作--------------*/ View itemview = null; if (convertView == null) { //初始化布局 itemview = mInflater.inflate(R.layout.item, parent, false); } else { //复用convertView itemview = convertView; } /*-------------- 查找控件 --------------*/ TextView title = (TextView) itemview.findViewById(R.id.tv_title); TextView desc = (TextView) itemview.findViewById(R.id.tv_desc); /*-------------- 数据绑定 --------------*/ Bean bean = mList.get(position); title.setText(bean.tilte); desc.setText(bean.desc); return itemview; }}
- 简化写法
public View getView(int position, View convertView, ViewGroup parent) { /*----------视图操作--------------*/ if (convertView == null) { //convertView为空, convertView = mInflater.inflate(R.layout.item, parent, false); } /*-------------- 查找控件 --------------*/ TextView title = (TextView) convertView.findViewById(R.id.tv_title); TextView desc = (TextView) convertView.findViewById(R.id.tv_desc); /*-------------- 数据绑定 --------------*/ Bean bean = mList.get(position); title.setText(bean.tilte); desc.setText(bean.desc); return convertView; }
中级
- 优点:利用ViewHolder存储找到的控件,避免多次findViewById
- 缺点:代码量大
public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; /*----------视图操作--------------*/ if (convertView == null) { //解析布局文件 convertView = mInflater.inflate(R.layout.item, parent, false); //创建对象 holder = new ViewHolder(); //设置标记 convertView.setTag(holder); /*-----------findview ,并存储到holder--------*/ holder.title = (TextView) convertView.findViewById(R.id.tv_title); holder.desc = (TextView) convertView.findViewById(R.id.tv_desc); } else { //根据标记,取出holder holder = (ViewHolder) convertView.getTag(); } /*-------------- 赋值 --------------*/ Bean bean = mList.get(position); holder.title.setText(bean.tilte); holder.desc.setText(bean.desc); return convertView;}//存放控件,避免多次findViewByIdclass ViewHolder{ TextView title; TextView desc ;}
高级
- holder可通用,减少代码量
public View getView(int position, View convertView, ViewGroup parent) { HolderView holderView = null; /*--------------视图操作--------------------*/ if (convertView == null) { //创建一个holder holderView = new HolderView(mContext, R.layout.item, position, parent); } else { //取出holder holderView = (HolderView) convertView.getTag(); //更新条目位置 holderView.mPosition=position; } /*--------------数据绑定--------------------*/ //数据 Bean bean = mList.get(position); //设置数据 holderView.setText(R.id.tv_commond, bean.commond) .setText(R.id.tv_title, bean.tilte) .setText(R.id.tv_desc, bean.desc) .setText(R.id.tv_time, bean.time); return holderView.mItemView;}
class HolderView { //条目视图 View mItemView; //条目位置 int mPosition; //实质上是存储<Integer,Object>的HashMap,效率高于HashMap SparseArray<View> mArrays; public HolderView(Context context,int layoutId,int position,ViewGroup parent) { LayoutInflater inflater=LayoutInflater.from(context); //初始化布局 this.mItemView =inflater.inflate(layoutId, parent, false); //创建容器 mArrays = new SparseArray<>(); //记录条目位置 mPosition = position; //标记 this.mItemView.setTag(this); } /** * 获取控件 */ public <T extends View> T getView(int viewId) { //根据id从容器取出控件 View view = mArrays.get(viewId); if (view == null) { //findview view = mItemView.findViewById(viewId); //缓存 mArrays.put(viewId, view); } return (T) view; } /** * 设置文本 */ public HolderView setText(int viewId, String string) { TextView textView = getView(viewId); textView.setText(string); return this; } //以后如果有ImageView,Button等空间,可以自行增加方法,进行数据绑定}
超级
- 封装通用Adapter
- 封装通用Holder
public abstract class CommonAdapter<T> extends BaseAdapter { protected List<T> mList; protected Context mContext; /** * 布局文件id */ protected int mLayoutId; public CommonAdapter(Context context, int layoutId, List<T> list) { this.mList = list; this.mLayoutId = layoutId; this.mContext = context; } @Override public int getCount() { return mList.size(); } @Override public Object getItem(int position) { return mList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { //找到holder BaseViewHolder holder = BaseViewHolder.get(mContext, mLayoutId, position, convertView, parent); T bean = mList.get(position); bindData(bean, holder); return holder.getItemView(); } /** * 数据和控件进行绑定 * * @param bean * @param holder */ protected abstract void bindData(T bean, BaseViewHolder holder);}
public class BaseViewHolder { /** * 泛型为<Integer,Object>的HashMap,效率比普通的HashMap高一些 * 存储子控件 */ private SparseArray<View> mArrays; /** * 条目位置 */ private int mPosition; /** * 条目视图View */ private View mItemView; /** * 获取条目位置 */ public int getPosition() { return mPosition; } /** * 获取条目视图 */ public View getItemView() { return mItemView; } //构造方法私有,禁止外部创建对象 //内部创建对象时:进行初始化布局等操作 private BaseViewHolder(Context context, int resId, int position, ViewGroup parent) { //创建容器 this.mArrays = new SparseArray<>(); //记录item位置 this.mPosition = position; //初始化布局 this.mItemView = LayoutInflater.from(context).inflate(resId, parent, false); //标记Holder this.mItemView.setTag(this); } /** * 获取Holder * * @param context 上下文 * @param layoutId 布局id * @param position 条目的位置 * @param convertView 复用的视图,convert(转换的) * @param parent 父view * @return */ public static BaseViewHolder get(Context context, int layoutId, int position, View convertView, ViewGroup parent) { if (convertView == null) { //返回一个新创建的Holder return new BaseViewHolder(context, layoutId, position, parent); } else { //返回一个从标记中取出Holder BaseViewHolder baseHolder = (BaseViewHolder) convertView.getTag(); //更新条目位置 baseHolder.mPosition = position; return baseHolder; } } /** * 根据控件Id找到控件 * * @param viewId 控件Id * @param <T> * @return */ public <T extends View> T getView(int viewId) { //从容器中取出控件 View view = mArrays.get(viewId); //控件为空 if (view == null) { //findview view = mItemView.findViewById(viewId); //缓存 mArrays.put(viewId, view); } return (T) view; } /** * 设置文本 * * @param viewId 控件Id * @param text 文本内容 * @return */ public BaseViewHolder setText(int viewId, String text) { TextView textView = getView(viewId); textView.setText(text); return this; } //更多方法,根据条目id和数据自行创建... }
0 0
- ListView适配器的写法
- Android中Listview适配器的优化写法
- ListView适配器中ViewHolder的超级简洁写法
- ListView的适配器模式
- Listview的适配器封装
- listview适配器的编写
- ListView的适配器笔记
- 普通的listview适配器
- Android的listview适配器
- listView的万能适配器
- Android适配器Adapter的写法
- listView的高级写法
- ListView 的标准写法
- ListView的标准写法
- Listview多条目加载轮播-适配器写法
- listView适配器调用的顺序
- ListView超强大的适配器
- 通用的ListView GridView适配器
- 继电器的作用
- React-Native 之 数据持久化
- 前端面试经典题目合集
- 水仙花数
- 多线程设计模式(一) Single Threaded Execution
- ListView适配器的写法
- 2017.3.25 SJY摆石子 思考记录
- (四)ROS坐标变换可视化(示例运行)
- tensorflow 风格迁移二
- 快速学习javaSE基础1-java概述(了解)
- Splunk 命令学习
- 手把手教你linux下google chrome浏览器root用户无法运行,以及flash插件安装
- 多项式求和
- 抽签