一、自定义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布局文件即可