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里的静态方法@Override public 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,然后进行填充数据
@Override void 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.youkuaiyun.com/xyz_fly/article/details/7931943。