万能适配器和万能ViewHolder配合实现ListView列表数据展示
2016-09-29 10:30
591 查看
在适配器的getView方法中使用ViewHolder来保存子布局项的组件信息时,传统的做法是:
在项目开发中需要编写很多个适配器,那么会有很多重复的代码,若使用万能ViewHolder和万能适配器将会减少很多代码,使用方法见下:
1. 编写万能ViewHolder:
2. 编写万能BaseAdapter适配器代码如下:
在具体实现适配器时,只需要new一个适配器并且继承CommonAdapter,然后在方法getView中具体去实现代码即可,示例如下:
这样我们若想再需要BaseAdapter适配器时,也只需要建立自己的Adapter继承CommonAdapter即可,只要在自己定义的Adapter中实现geView方法,不需要每次都去写ViewHolder和BaseAdapter中那些冗余的代码
Activity中只需要调用下面2行代码即可:
public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if(convertView == null){ convertView = inflater.inflate(R.layout.listview_item,parent,false); holder = new ViewHolder(); holder.title = (TextView) convertView.findViewById(R.id.title); holder.content = (TextView) convertView.findViewById(R.id.content); convertView.setTag(holder); }else{ holder = (ViewHolder) convertView.getTag(); } holder.title.setText(mDatas.get(position).getTitle()); holder.content.setText(mDatas.get(position).getContent()); return convertView; } class ViewHolder{ private TextView title; private TextView content; }
在项目开发中需要编写很多个适配器,那么会有很多重复的代码,若使用万能ViewHolder和万能适配器将会减少很多代码,使用方法见下:
1. 编写万能ViewHolder:
public class CommonViewHolder { private int mPosition; // mViews用于存放界面上的组件 private SparseArray<View> mViews; private View mCconvertView; public CommonViewHolder(Context context, ViewGroup parent,int layoutId,int position){ this.mPosition = position; this.mViews = new SparseArray<>(); this.mCconvertView = LayoutInflater.from(context).inflate(layoutId,parent,false); mCconvertView.setTag(this); } // 获取ViewHolder public static CommonViewHolder getViewHolder(Context context, View convertView, ViewGroup parent, int layoutId, int position){ CommonViewHolder holder; if(convertView == null){ holder = new CommonViewHolder(context,parent,layoutId,position); }else{ holder = (CommonViewHolder)convertView.getTag(); holder.mPosition = position; } return holder; } // 获取convertView public View getConvertView(){ return mCconvertView; } // 用来获取convertview中的组件 组件存在SparseArray中 public View getView(int viewId){ View view = mViews.get(viewId); if(view == null){ view = mCconvertView.findViewById(viewId); mViews.put(viewId,view); } return view; } }
2. 编写万能BaseAdapter适配器代码如下:
public abstract class CommonAdapter<T> extends BaseAdapter{ // 定义这两个属性为protected,是为了让子类能够访问 protected Context mContext; protected List<T> mDatas; public CommonAdapter(Context context,List<T> datas){ this.mContext = context; this.mDatas = datas; } @Override public int getCount() { return mDatas.size(); } @Override public Object getItem(int position) { return mDatas.get(position); } @Override public long getItemId(int position) { return position; } // 在此定义要具体实现的抽象方法 ,让子类去实现 @Override public abstract View getView(int position, View convertView, ViewGroup parent); }
在具体实现适配器时,只需要new一个适配器并且继承CommonAdapter,然后在方法getView中具体去实现代码即可,示例如下:
public class MyBaseAdapter extends CommonAdapter{ public MyBaseAdapter(Context context, List datas) { super(context, datas); } @Override public View getView(int position, View convertView, ViewGroup parent) { CommonViewHolder holder = CommonViewHolder.getViewHolder(mContext,convertView, // 此处使用了万能ViewHolder parent, R.layout.listview_item,position); Bean bean = (Bean) mDatas.get(position); TextView tv1 = (TextView) holder.getView(R.id.title); tv1.setText(bean.getTitle()); TextView tv2 = (TextView) holder.getView(R.id.content); tv2.setText(bean.getTitle()); TextView tv3 = (TextView) holder.getView(R.id.time); tv3.setText(bean.getTitle()); TextView tv4 = (TextView) holder.getView(R.id.tel); tv4.setText(bean.getTitle()); return holder.getConvertView(); } }
这样我们若想再需要BaseAdapter适配器时,也只需要建立自己的Adapter继承CommonAdapter即可,只要在自己定义的Adapter中实现geView方法,不需要每次都去写ViewHolder和BaseAdapter中那些冗余的代码
Activity中只需要调用下面2行代码即可:
MyBaseAdapter adapter = new MyBaseAdapter(MainActivity.this,beanList); listView.setAdapter(adapter);
相关文章推荐
- 自定义Listview的适配器实现ViewHolder优化
- Android上实现一个简单的天气预报APP(九) ListView展示城市列表、单击更新天气数据
- 展示数据使用:recyclerview,retrofit,greendao,butterknife,eventbus,fresco。实现效果图列表。MVP模式。
- 万能适配器1 ViewHolder应用于Listview
- Android中ListView实现展示列表数据
- 使用RecycleView实现动态获取数据展开二级列表展示
- ListView + SpringView,实现条目的数据展示[网络数据统一处理版]
- Android RecyclerView实现数据列表展示效果
- ListView + SpringView,实现条目的数据展示
- Listview之万能适配器封装,结合上一篇博客ViewHolder封装类使用
- 九、android的ListView实现数据列表展示
- Android学习笔记---19_采用ListView实现数据列表显示,以及各种适配器使用,和如何写自己的适配器
- 使用ViewSwitcher实现ListView的数据动态加载[学习]
- 解决ListView滚动复用convertview和ViewHolder数据填充错乱
- 实例教程八:采用ListView实现数据列表显示
- 采用ListView实现数据列表显示——SimpleCursorAdapter
- Project——SQLite数据库操作(采用ListView实现数据列表展现)
- ListView 实现数据列表
- 【处女作】android中的ListView结合BaseAdapter实例 ,加入ViewHolder实现高性能ListView
- Android应用中使用ListView实现数据列表显示(传智播客视频笔记)