自定义多ListView,加载多类型Item

一、自定义adapter继承

自定义adapter需要继承BaseAdapter,尤其需要重写

getItemViewType 和 getViewTypeCount()

自定义adapter代码:

package com.chy.arrayadapter;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.chy.entity.BaseEntity;
import com.chy.parcelsystem.R;
import com.chy.tools.FormateDoubleUtils;
import com.chy.tools.ItemType;
import com.chy.tools.RoundRectImageView;
import com.esri.arcgisruntime.data.Feature;
import com.esri.arcgisruntime.data.Field;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 重新adapter 多布局(多个item样式)
 * */
public class AttrAdapter extends BaseAdapter {
    private Context context;
    private List<BaseEntity> list;

    public AttrAdapter(Context _context,List<BaseEntity> _list){
        this.context = _context;
        this.list = _list;
    }

    @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;
    }

    /**
     *  如果getItemViewType 返回值大于等于0,则需要处理复用逻辑,否则内存会一直增长。
     *  如果只复写了getItemViewType而没有复写getTypeCount,则getItemViewType不生效。
     *
     * getItemViewType() 返回值一定要小于getViewTypeCount() 返回值
     * 否则会报错 -- 数组越位
     *
     * */
    @Override
    public int getItemViewType(int position) {
        if (list != null && position < list.size()) {
            return list.get(position).getItemType();
        }
       return super.getItemViewType(position);
    }

    @Override
    public int getViewTypeCount() {
        // 返回几种类型
        return ItemType.TYPE_COUNT;
    }

    @NonNull
    @Override
    public View getView(int position,@Nullable View convertView,@NonNull ViewGroup parent) {
        // 不同类型的ViewHolder
        ImageHolder imageHolder = null;// 图片类型
        KVViewHolder kvViewHolder = null;//key:val类型
        TVViewHolder tvViewHolder = null;// textview类型
        // 对象
        BaseEntity baseEntity = null;
        /**
         * 对类型进行判断,分别inflate不同的布局.
         * */
        int viewType = getItemViewType(position);
        switch (viewType){
            case ItemType.TYPE_IMGAE:// 图片
                if (convertView == null){
                    convertView = LayoutInflater.from(context).inflate(R.layout.img_list_item,null);

                    imageHolder = new ImageHolder();
                    imageHolder.itemRoundRectImg = convertView.findViewById(R.id.itemRoundRectImg);
                    // 设置tag
                    convertView.setTag(imageHolder);
                }else {
                    // 获取tag
                    imageHolder = (ImageHolder) convertView.getTag();
                }

                baseEntity = list.get(position);
                Map<String,Object> imgMap = baseEntity.getMap();
                Object imgID = imgMap.get("ImageID");
                // 设置图片
                if (imgID != null){
                    imageHolder.itemRoundRectImg.setImageDrawable(context.getDrawable(R.mipmap.ic_logo));
                }
                break;
            case ItemType.TYPE_KEY_VAL:// key:val
                if (convertView == null){
                    convertView = LayoutInflater.from(context).inflate(R.layout.attr_list_item,null);

                    kvViewHolder = new KVViewHolder();
                    kvViewHolder.attrKeyTV = convertView.findViewById(R.id.attrKeyTV);
                    kvViewHolder.attrValueTV = convertView.findViewById(R.id.attrValueTV);

                    // 设置tag
                    convertView.setTag(kvViewHolder);
                }else {
                    // 获取tag
                    kvViewHolder = (KVViewHolder) convertView.getTag();
                }
                baseEntity = list.get(position);
                Map<String,Object> kvMap = baseEntity.getMap();

                String attrKey = null;// key值
                String attrValue = null;// value值
                // 获取地块信息
                Set<String> keySet = kvMap.keySet();
                // 遍历keySet,并输出key的值
                for(String key : keySet){
                    attrKey = getStringInfo(key);
                    attrValue = getStringInfo(kvMap.get(key));
                }

                // key值
                kvViewHolder.attrKeyTV.setText(attrKey);

                // value值
                if (attrValue.equals("") || attrValue.equals("null")){
                    attrValue = "暂无数据";
                }
                kvViewHolder.attrValueTV.setText(attrValue);

                break;
            case ItemType.TYPE_TEXT://textview
                if (convertView == null){
                    convertView = LayoutInflater.from(context).inflate(R.layout.detail_list_item,null);

                    tvViewHolder = new TVViewHolder();
                    tvViewHolder.itemDetail = convertView.findViewById(R.id.itemDetail);
                    // 设置tag
                    convertView.setTag(tvViewHolder);
                }else {
                    // 获取tag
                    tvViewHolder = (TVViewHolder) convertView.getTag();
                }

                baseEntity = list.get(position);
                Map<String,Object> tvMap = baseEntity.getMap();
                Object detailId = tvMap.get("DetailID");
                // 设置图片
                if (detailId!=null){
                    tvViewHolder.itemDetail.setText("长春市行政区划面积24592平方公里,其中," +
                            "耕地面积15585.27平方公里,占全市的63%;城镇村及工矿用地2287.56平方公里," +
                            "占全市的9%。\n");
                }
                break;
        }


       return convertView;
   }

   /**
    * 图片类型ViewHolder
    * */
   static class ImageHolder{
       RoundRectImageView itemRoundRectImg;// 图片
   }


    /**
     * key:val 类型ViewHolder
     */
    static class KVViewHolder{
       // 地块信息区域
       TextView attrKeyTV;// key
       TextView attrValueTV;// value
    }

    /**
     * TextView 类型ViewHolder
     */
    static class TVViewHolder{
       // 地块附近信息区域
       TextView itemDetail;// 信息
    }


    /**
     * 属性类型转换
     */
    private String getStringInfo(Object obj){
        String result = null;
        if (obj instanceof Double){
            result = FormateDoubleUtils.formatDoubleToStrong((Double) obj);
        }else {
            result = String.valueOf(obj);
        }

        return result.trim();
    }

}
ItemType代码:
package com.chy.tools;

public class ItemType {

    public static final int TYPE_TEXT = 0;// TextView布局
    public static final int TYPE_IMGAE = 1;// 图片布局
    public static final int TYPE_KEY_VAL = 2;// key : val布局形势

    public static final int TYPE_COUNT = 3;// 种类的数量

    private String name;
    private int type;

    public ItemType(int type, String name) {
        this.type = type;
        this.name = name;
    }

    public int getType() {
        return type;
    }

    public String getName() {
        return name;
    }
}
BaseEntity代码:
package com.chy.entity;

import java.util.Map;

public class BaseEntity {
    private int itemType;// 类型
    private Map<String,Object> map;// map集合

    /**
     * 构造函数
     * */
    public BaseEntity(int itemType,Map<String,Object> map){
        this.itemType = itemType;
        this.map = map;
    }

    public int getItemType() {
        return itemType;
    }

    public void setItemType(int itemType) {
        this.itemType = itemType;
    }

    public Map<String, Object> getMap() {
        return map;
    }

    public void setMap(Map<String, Object> map) {
        this.map = map;
    }
}

剩下就写自己的xml布局文件即可

猜你喜欢

转载自blog.csdn.net/qq_19688207/article/details/129911665