publicabstractclassMultiTypeFactoryAdapter<EextendsMultiTypeViewTypeListener>extendsBaseAdapter{protectedList<E>items;protectedfinalLayoutInflaterinflater;publicMultiTypeFactoryAdapter(Contextcontext){this(context,newArrayList<E>());}publicMultiTypeFactoryAdapter(Contextcontext,List<E>items){inflater=LayoutInflater.from(context);this.items=items;}publicvoidadd(Eitem){if(item==null)return;items.add(item);notifyDataSetChanged();}publicvoidadd(E[]arrays){if(arrays==null||arrays.length<=0)return;for(inti=0,lenght=arrays.length;i<lenght;i++){items.add(arrays[i]);}notifyDataSetChanged();}publicvoidaddAll(Collection<?extendsE>items){if(items==null)return;this.items.addAll(items);notifyDataSetChanged();}@OverridepublicintgetCount(){returnitems==null?0:items.size();}@OverridepublicEgetItem(intposition){returnitems.get(position);}@OverridepubliclonggetItemId(intposition){returnposition;}@OverridepublicintgetItemViewType(intposition){returnitems.get(position).getType();}@SuppressWarnings("unchecked")@OverridepublicViewgetView(intposition,ViewconvertView,ViewGroupparent){MultiTypeViewHolderFactory<E>holder=null;finalinttype=getItemViewType(position);if(convertView==null){convertView=inflater.inflate(getChildLayoutId(type),parent,false);holder=createViewHolder(convertView,type);convertView.setTag(holder);}else{holder=(MultiTypeViewHolderFactory<E>)convertView.getTag();}holder.init(getItem(position),position,this);returnconvertView;}/** * get type view count */@OverridepublicabstractintgetViewTypeCount();/** * get layout id for type * @param type * @return layout id */protectedabstractintgetChildLayoutId(inttype);/** * get ViewHolder for type * @param view * @param type * @return */protectedabstractMultiTypeViewHolderFactory<E>createViewHolder(Viewview,inttype);/** * * */publicstaticinterfaceMultiTypeViewHolderFactory<E>{publicvoidinit(finalEitem,finalintposition,finalMultiTypeFactoryAdapter<?>adapter);}}