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
原创粉丝点击