重新封装BaseAdapter,打造最简洁框架
来源:互联网 发布:计算机编程课程 编辑:程序博客网 时间:2024/06/05 12:30
public abstract class MyBaseAdapter<T> extends BaseAdapter { protected Context context; protected List<T> list; protected LayoutInflater inflater; private final SparseArray<View> views; public MyBaseAdapter(Context context, List<T> list) { this.context = context; this.list = list; inflater = LayoutInflater.from(context); this.views = new SparseArray<>(); } public void updateData(List<T> list) { this.list = list; } public void clear() { this.list.clear(); notifyDataSetChanged(); } public void addAll(List<T> list) { if (list != null) { this.list.addAll(list); notifyDataSetChanged(); } } @Override public int getCount() { return list == null ? 0 : list.size(); } @Override public T getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { if(null == convertView) { convertView = createView(inflater); } updateView(convertView, position, getItem(position)); return convertView; } public static class ViewHolder { /** * 减少代码重用,静态获取控件方法 * @param view * @param id * @param <T> * @return */ @SuppressWarnings("unchecked") public static <T extends View> T get(View view, int id) { SparseArray<View> viewHolder = (SparseArray<View>) view.getTag(); if (viewHolder == null) { viewHolder = new SparseArray<View>(); view.setTag(viewHolder); } View childView = viewHolder.get(id); if (childView == null) { childView = view.findViewById(id); viewHolder.put(id, childView); } return (T) childView; } } /** * 创建View * @param inflater * @return */ abstract View createView(LayoutInflater inflater); /** * 更新View * @param view * @param position * @param data */ abstract void updateView(View view, int position, T data);}
以上。
更新数据、清除数据、添加数据的方法自不用说,里面核心就是getView方法的重新构造,其中里面createView的抽象方法用于创建View,返回一个布局界面,里面添加一句代码就行
updateView方法用于写里面的数据填充,当然在原来架构里面的获取控件的Viewholder要在这个方法里进行构建,由于每一个子类Adapter的ViewHolder都各不一样,所以我想了个办法通过ViewHolder里的静态方法@Overridepublic View createView(LayoutInflater inflater) { return inflater.inflate(R.layout.listview_order_item, null);}
public static <T extends View> T get(View view, int id) { SparseArray<View> viewHolder = (SparseArray<View>) view.getTag(); if (viewHolder == null) { viewHolder = new SparseArray<View>(); view.setTag(viewHolder); } View childView = viewHolder.get(id); if (childView == null) { childView = view.findViewById(id); viewHolder.put(id, childView); } return (T) childView; }来直接获取所需要的View,然后进行填充数据
@Overridevoid updateView(View view, int position, OrderEntity data) { TextView tv_order_item_id, tv_order_item_name, tv_order_item_time; tv_order_item_id = ViewHolder.get(view, R.id.tv_order_item_id); tv_order_item_id.setText("大保健特价"); tv_order_item_name = ViewHolder.get(view, R.id.tv_order_item_name); tv_order_item_name.setText("马国清");}其中所有Item的Viewholder对象用SparseArray对象来进行存储,从而实现对象的复用性。
简单介绍一下SparseArray,由于SDK升级之后HashMap被建议替换SparseArray使用,简单的来说就是SparseArray具有更高的效率,它是使用二分法进行存储数据的。详细可参考http://blog.csdn.net/xyz_fly/article/details/7931943。
0 0
- 重新封装BaseAdapter,打造最简洁框架
- BaseAdapter的最简单的封装
- ONE-Kotlin 致力于打造最简洁的Android项目
- 打造通用的BaseAdapter
- 浅谈Retrofit封装-让框架更加简洁易用
- 对Android权限请求的封装,打造简洁好用的requestPermissions
- EasyPermission Android 6.0 最简洁的权限框架
- BaseAdapter的简单封装
- 封装BaseAdapter 实现类中复用
- BaseAdapter的简单封装
- BaseAdapter简单封装
- 对BaseAdapter进行封装
- BaseAdapter的封装
- BaseAdapter封装优化
- BaseAdapter简单封装
- BaseAdapter简单封装
- baseadapter的二次封装
- BaseAdapter的封装
- SolrCloud功能和架构 SolrCloud Features and Architecture
- 接口和抽象类
- Undefined symbols for architecture x86_64/armv7 解决方法
- 放弃一切
- DOM
- 重新封装BaseAdapter,打造最简洁框架
- linux 链接库文件出现“undefined reference to" 问题的解决方法
- RTSP 交互示例
- 婚外情网站的谎言和资料外泄故事!企业该吸取怎样的教训?
- ssh使用整理
- 定长线段最多覆盖点的个数
- CentOS下搭建NGINX+SVN (2012-07-22 16:56:26)
- 10个实用的但偏执的Java编程技术
- 流程控制2