Android 重写BaseAdapter中的getView
来源:互联网 发布:excel重复数据筛选公式 编辑:程序博客网 时间:2024/05/21 23:31
一开始的设计是,一个ListView中最上面是一个EditText,下面全部是TextView,所以在getView代码如下:
public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (position== 0) {//最上面为搜索 final ShViewHolder shViewHolder; if(convertView==null) { shViewHolder = new ShViewHolder(); convertView = inflate.inflate(R.layout.city_search_item, null); shViewHolder.editText = (EditText) convertView .findViewById(R.id.sh); convertView.setTag(shViewHolder); }else{ shViewHolder = (ShViewHolder) convertView.getTag(); } } else { if (convertView == null) { convertView = inflate.inflate(R.layout.city_list_item, null); holder = new ViewHolder(); holder.firstLetterSearch = (TextView) convertView .findViewById(R.id.city_list_item_frist); holder.name = (TextView) convertView .findViewById(R.id.city_list_item_city); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.name.setText(list.get(position).getName()); String currentStr = list.get(position).getPinyi(); String previewStr = list.get(position - 1).getPinyi()==null ? "" : list.get(position - 1).getPinyi(); if (!previewStr.equals(currentStr)) { holder.firstLetterSearch.setText(currentStr); holder.firstLetterSearch.setVisibility(View.VISIBLE); } } return convertView;}
private static class ViewHolder{ TextView firstLetterSearch; // 首字母标题 TextView name; // 城市名字}private static class ShViewHolder { EditText editText;}
ViewHolder和shViewHolder是自定义类型,用来存储数据;
这时候运行会出现各种错误;
主要是类型转换java.lang.ClassCastException和java.lang.NullPointerException;
为什么是这些错误呢;
后来分析:
主要是:convertView = inflate.inflate(R.layout.city_search_item, null);
convertView = inflate.inflate(R.layout.city_list_item, null);
这里加载2个不同的listItem样式在return convertView;导致前面的给后面的替代了;
在Adapter.notifyDataSetChanged()后;
shViewHolder = (ShViewHolder) convertView.getTag();强制类型转换就会出现错误;
后来查看资料,资料上的解释是,如果需要不同的自定义listitem样式需要重写Adapter另外的中的getItemViewType(int position);和 getViewTypeCount();代码如下:@Overridepublic int getItemViewType(int position) { if (position == 0) { return 0; } else { return 1; }}@Overridepublic int getViewTypeCount() { return 2;}注意:这里我觉得有很很坑的问题:如果你写成这样:@Overridepublic int getItemViewType(int position) { if (position == 0) { return 1; } else { return 2; }}@Overridepublic int getViewTypeCount() { return 2;}就会出现错误;为什么呢?又是慢慢找资料之路,后来在一篇大神的博客里面提到:getViewTypeCount()>getItemViewType(int position);
什么意思呢?就是在getViewTypeCount返回的类型数量必须大于getItemViewType中的最大类型的值。我很纳闷,完全不知道这样设计的深意。如果有了解为什么要这样的小伙伴可以给我留言。附上完整的类:public class CityListViewAdapter extends BaseAdapter { private Context context; private List<City> list; private LayoutInflater inflate; public CityListViewAdapter(Context context, List<City> list){ this.context = context; this.list = list; inflate = LayoutInflater.from(context); } @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } @Override public int getItemViewType(int position) { if (position == 0) { return 0; } else { return 1; } } @Override public int getViewTypeCount() { return 2; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; int viewType = getItemViewType(position); if (viewType == 0) {//最上面为搜索 final ShViewHolder shViewHolder; if(convertView==null) { shViewHolder = new ShViewHolder(); convertView = inflate.inflate(R.layout.city_search_item, null); shViewHolder.editText = (EditText) convertView .findViewById(R.id.sh); convertView.setTag(shViewHolder); }else{ shViewHolder = (ShViewHolder) convertView.getTag(); } } else { if (convertView == null) { convertView = inflate.inflate(R.layout.city_list_item, null); holder = new ViewHolder(); holder.firstLetterSearch = (TextView) convertView .findViewById(R.id.city_list_item_frist); holder.name = (TextView) convertView .findViewById(R.id.city_list_item_city); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.name.setText(list.get(position).getName()); String currentStr = list.get(position).getPinyi(); String previewStr = list.get(position - 1).getPinyi()==null ? "" : list.get(position - 1).getPinyi(); if (!previewStr.equals(currentStr)) { holder.firstLetterSearch.setText(currentStr); holder.firstLetterSearch.setVisibility(View.VISIBLE); } } return convertView; } private static class ViewHolder{ TextView firstLetterSearch; // 首字母标题 TextView name; // 城市名字 } private static class ShViewHolder { EditText editText; }}
0 0
- Android 重写BaseAdapter中的getView
- Gallery重写baseadapter时getView函数中的view重用
- Android 重写BaseAdapter碰到getView中convertView出现错误
- Android-BaseAdapter中getView()
- android BaseAdapter getView 理解
- android-BaseAdapter和getView
- 重写BaseAdapter后getView的模版
- Android-BaseAdapter中重写getview的心得以及发现convertView回收的机制
- android 重写BaseAdapter类
- BaseAdapter,getView
- android baseadapter的getview调用两次
- android baseadapter getview() viewhandler机制详解
- android BaseAdapter的getView的调用时机
- android BaseAdapter的getView的调用时机
- Android BaseAdapter类重写模版
- 在BaseAdapter中的GetView方法中的一些问题
- BaseAdapter中的getview以及convertView的回收机制
- android: BaseAdapter的getview方法会多次重复调用
- FW与手机APP交互的问题
- 在dialog程序中如何call screen屏幕位置
- 2015腾讯就业讲座感想
- C#中string和stringBuilder的区别
- 软件测试分类
- Android 重写BaseAdapter中的getView
- 第一篇:OC类的约定
- Android中JNI的使用方法
- spring带来的春天
- 动态规划小结
- hdu 1996 汉诺塔VI 规律
- easyui表单验证
- 解决制作图片轮播图(首页轮播图/引导页轮播图)时图片距离屏幕有一定距离的问题;
- iOS开发:iOS常见面试题