1、主要使用到了BaseAdapter中的方法
@Override public int getItemViewType(int position) { int isRoot = Integer.parseInt(listData.get(position).get("isRoot")); if (isRoot == 1) { return TYPE_R; } else { return TYPE_C; } }
根据列表数据判断当前Item使用哪个Type
2、在getView()的时候根据不同type选择使用不同的布局
@Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolderRoot viewHolderRoot = null; ViewHolderChild viewHolderChild = null; int itemType = getItemViewType(position); if (convertView == null) { switch (itemType) { case TYPE_R: convertView = LayoutInflater.from(context).inflate(R.layout.root_list_item, parent, false); viewHolderRoot = new ViewHolderRoot(); viewHolderRoot.tvRootName = convertView.findViewById(R.id.tvRootName); viewHolderRoot.checkBox = convertView.findViewById(R.id.checkBox); convertView.setTag(viewHolderRoot); break; case TYPE_C: convertView = LayoutInflater.from(context).inflate(R.layout.child_list_item, parent, false); viewHolderChild = new ViewHolderChild(); viewHolderChild.tvChildName = convertView.findViewById(R.id.tvChildName); viewHolderChild.image = convertView.findViewById(R.id.image); convertView.setTag(viewHolderChild); break; } } else { switch (itemType) { case TYPE_R: viewHolderRoot = (ViewHolderRoot) convertView.getTag(); break; case TYPE_C: viewHolderChild = (ViewHolderChild) convertView.getTag(); break; } } HashMap<String, String> hs = listData.get(position); switch (itemType) { case TYPE_R: viewHolderRoot.tvRootName.setText(hs.get("rootName")); break; case TYPE_C: viewHolderChild.tvChildName.setText(hs.get("childName")); viewHolderChild.image.setBackgroundResource(R.mipmap.ic_launcher); break; } return convertView; }
同事对于不同布局使用不同的ViewHolder
static class ViewHolderRoot { TextView tvRootName; CheckBox checkBox; } static class ViewHolderChild { TextView tvChildName; ImageView image; }完整代码 点击打开链接