1. 程式人生 > >ListView多佈局展示 異常 陣列下標越界

ListView多佈局展示 異常 陣列下標越界

ListView多佈局展示用處很多
該異常如下:
這裡寫圖片描述

這是怎麼回事呢?
具體程式碼如下:

    public static final int TYPE_MALE = 1;
    public static final int TYPE_FEMALE = 2;
   @Override
    public int getViewTypeCount() {
        return 2;
    }
    @Override
    public int getItemViewType(int position) {
        String sex = list.get(position).getSex();
        switch
(sex) { case "男": return TYPE_MALE; case "女": return TYPE_FEMALE; default: return TYPE_MALE; } }

TYPE_MALE = 1和TYPE_FEMALE = 2,這兩個值不可以隨意賦值,必須從0開始,一次增大

對程式碼做修正其他地方,無需修改就可以正常運行了

    public static final int
TYPE_MALE = 0; public static final int TYPE_FEMALE = 1; @Override public int getViewTypeCount() { return 2; } @Override public int getItemViewType(int position) { String sex = list.get(position).getSex(); switch (sex) { case "男": return
TYPE_MALE; case "女": return TYPE_FEMALE; default: return TYPE_MALE; } }

listView的多佈局展示中getView方法最重要,再次貼出該段程式碼

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View ret = null;
        ViewHolder1 holder1 = null;
        ViewHolder2 holder2 = null;
        int type = getItemViewType(position);

        //進行復用,如果convertView為空,根據type生成對應佈局
        if (convertView != null) {
            ret = convertView;
        } else {
            switch (type) {
                case TYPE_MALE:
                    ret = LayoutInflater.from(context).inflate(R.layout.item_man, null);
                    break;
                case TYPE_FEMALE:
                    ret = LayoutInflater.from(context).inflate(R.layout.item_femal, null);
                    break;
            }
        }
        //例項化ViewHolder ,findViewById
        switch (type) {
            case TYPE_MALE:
                holder1 = (ViewHolder1) ret.getTag();
                if (holder1 == null) {
                    holder1 = new ViewHolder1();
                    holder1.man_image = ((ImageView) ret.findViewById(R.id.man_image));
                    holder1.man_name = ((TextView) ret.findViewById(R.id.man_name));
                    holder1.sex = ((TextView) ret.findViewById(R.id.sex));
                    ret.setTag(holder1);
                }
                break;
            case TYPE_FEMALE:
                holder2 = (ViewHolder2) ret.getTag();
                if (holder2 == null) {
                    holder2 = new ViewHolder2();
                    holder2.female_image_one = ((ImageView) ret.findViewById(R.id.femal_image_one));
                    holder2.female_image_two = ((ImageView) ret.findViewById(R.id.femal_image_two));
                    holder2.female_name = ((TextView) ret.findViewById(R.id.femal_name));
                    holder2.sex = ((TextView) ret.findViewById(R.id.sex));
                    ret.setTag(holder2);
                }
                break;
        }
        //進行賦值
        switch (type) {
            case TYPE_MALE:
                holder1.man_image.setImageResource(list.get(position).getImage());
                holder1.man_name.setText(list.get(position).getName());
                holder1.sex.setText(list.get(position).getSex());
                break;
            case TYPE_FEMALE:
                holder2.female_image_one.setImageResource(list.get(position).getImage());
                holder2.female_image_two.setImageResource(list.get(position).getImage());
                holder2.female_name.setText(list.get(position).getName());
                holder2.sex.setText(list.get(position).getSex());
                break;
        }
        return ret;
    }