多布局BaseAdapter的封装TeachMultiTypeAdapter
来源:互联网 发布:数据资产管理 编辑:程序博客网 时间:2024/06/12 19:55
为了适应ListView中item的多布局要求,需要在Adapter中重写他的 getViewTypeCount(),getItemId()方法,并且要重写ViewHorld类,最后在getView()方法中switch进行判断,返回不同的布局,这样就产生了大量的重复代码,所以就有了对多布局BaseAdatper的封装
①,在构造方法中需要congtext,<T>data,...子布局LayoutId数组
public TeachMultiTypeAdapter(Context context, List<T> data,int... layoutIds){ inflater = LayoutInflater.from(context); this.layoutIds = layoutIds; if (data != null) { this.data = data; }else{ this.data = new ArrayList<>(); } }
②getItemViewType中需要根据当前的position获取对应的对象,根据反射获得他的对象,再根据获得的对象,得到type字段中的值(来自网络中接口中的数据一般会有该字段),返回type值(type就是当前item的样式)
public int getItemViewType(int position) { int type = 0; // 根据位置获取对应的对象 T item = getItem(position); // 获取对象的Class Class<?> itemClass = item.getClass(); try { // 获取Class中type字段 Field field = itemClass.getDeclaredField("type"); // 添加访问权限 field.setAccessible(true); // 获取字段中的值 type = field.getInt(item); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } return type; }
③ViewHolder的复用
protected static class ViewHolder{ private View itemView; private Map<Integer,View> cacheViews; public ViewHolder(View itemView) { this.itemView = itemView; cacheViews = new HashMap<>(); } public View getView(int resId){ View view = null; if (cacheViews.containsKey(resId)) { view = cacheViews.get(resId); }else{ view = itemView.findViewById(resId); cacheViews.put(resId,view); } return view; } }
④getView中返回子布局要与type中的字段对应
public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { // 写布局的时候,布局id在传入要和type 对应 type 0 对应 索引0 ,type 1 对应索引 1... convertView = inflater.inflate(layoutIds[getItemViewType(position)],parent,false); holder = new ViewHolder(convertView); convertView.setTag(holder); }else{ holder = (ViewHolder) convertView.getTag(); } // 加载数据 bindData(holder,getItem(position),position); return convertView; }
⑤子类实现该Adapter中的方法
重要的记载数据要在实现的抽象方法中做
public abstract void bindData(ViewHolder holder, T item, int position);
⑥实现抽象需要注意对holder进行判断,
public void bindData(ViewHolder holder, House item, int position) { switch (item.getType()) { case 0 : TextView textZero = (TextView) holder.getView(R.id.teach_item_zero_title); textZero.setText(item.getTitle()); break; case 1: TextView textOne = (TextView) holder.getView(R.id.teach_item_one_title); textOne.setText(item.getTitle()); break; } }
0 0
- 多布局BaseAdapter的封装TeachMultiTypeAdapter
- BaseAdapter的简单封装
- BaseAdapter的简单封装
- BaseAdapter的封装
- baseadapter的二次封装
- BaseAdapter的封装
- recyclerView的 BaseAdapter的封装
- Butterknife下的BaseAdapter封装。
- BaseAdapter的再次封装使用
- BaseAdapter的封装和实现
- BaseAdapter 中加载多个不同的自己的布局
- android BaseAdapter多布局缓存
- BaseAdapter的最简单的封装
- 对BaseAdapter和ViewHolder的封装
- Android BaseAdapter的极简封装
- BaseAdapter的封装来实现模块化开发
- 封装RecyclerView的基础适配器BaseAdapter
- 为Recycle添加头尾布局的BaseAdapter
- 使用Visual Studio Code + Node.js搭建TypeScript开发环境
- 第十周:C语言:回文数
- 10000位回文数的前1000位
- 类的继承
- 第十周项目一计算个人所得税
- 多布局BaseAdapter的封装TeachMultiTypeAdapter
- 数据库数据去重方法
- 第十周—回文数1
- c语言基础知识:局部变量与全局变量
- [LeetCode]--47. Permutations II
- Tomcat中如何配置使用APR
- tjut 5950
- 第十周 回文数(一)
- 文件管理 特殊权限