多布局BaseAdapter的封装TeachMultiTypeAdapter

来源:互联网 发布:数据资产管理 编辑:程序博客网 时间:2024/06/12 19:55

为了适应ListView中item的多布局要求,需要在Adapter中重写他的 getViewTypeCount(),getItemId()方法,并且要重写ViewHorld类,最后在getView()方法中switch进行判断,返回不同的布局,这样就产生了大量的重复代码,所以就有了对多布局BaseAdatper的封装

①,在构造方法中需要congtext,<T>data,...子布局LayoutId数组

public TeachMultiTypeAdapter(Context context, List<T> data,int... layoutIds){        inflater = LayoutInflater.from(context);        this.layoutIds = layoutIds;        if (data != null) {            this.data = data;        }else{            this.data = new ArrayList<>();        }    }

②getItemViewType中需要根据当前的position获取对应的对象,根据反射获得他的对象,再根据获得的对象,得到type字段中的值(来自网络中接口中的数据一般会有该字段),返回type值(type就是当前item的样式)

public int getItemViewType(int position) {        int type = 0;        // 根据位置获取对应的对象        T item = getItem(position);        // 获取对象的Class        Class<?> itemClass = item.getClass();        try {            // 获取Class中type字段            Field field = itemClass.getDeclaredField("type");            // 添加访问权限            field.setAccessible(true);            // 获取字段中的值            type = field.getInt(item);        } catch (NoSuchFieldException e) {            e.printStackTrace();        } catch (IllegalAccessException e) {            e.printStackTrace();        }        return type;    }

③ViewHolder的复用

protected static class ViewHolder{        private View itemView;        private Map<Integer,View> cacheViews;        public ViewHolder(View itemView) {            this.itemView = itemView;            cacheViews = new HashMap<>();        }        public View getView(int resId){            View view = null;            if (cacheViews.containsKey(resId)) {                view = cacheViews.get(resId);            }else{                view = itemView.findViewById(resId);                cacheViews.put(resId,view);            }            return view;        }    }

④getView中返回子布局要与type中的字段对应

 public View getView(int position, View convertView, ViewGroup parent) {        ViewHolder holder = null;        if (convertView == null) {            // 写布局的时候,布局id在传入要和type 对应 type 0 对应 索引0 ,type 1 对应索引 1...            convertView = inflater.inflate(layoutIds[getItemViewType(position)],parent,false);            holder = new ViewHolder(convertView);            convertView.setTag(holder);        }else{            holder = (ViewHolder) convertView.getTag();        }        // 加载数据        bindData(holder,getItem(position),position);        return convertView;    }

⑤子类实现该Adapter中的方法

重要的记载数据要在实现的抽象方法中做

public abstract void bindData(ViewHolder holder, T item, int position);

⑥实现抽象需要注意对holder进行判断,

public void bindData(ViewHolder holder, House item, int position) {        switch (item.getType()) {            case 0 :                TextView textZero = (TextView) holder.getView(R.id.teach_item_zero_title);                textZero.setText(item.getTitle());                break;            case 1:                TextView textOne = (TextView) holder.getView(R.id.teach_item_one_title);                textOne.setText(item.getTitle());                break;        }    }


0 0
原创粉丝点击