在 Android中 要实现LIstView的不同布局的显示方式,要重写 LIstView的Adapter中的 getViewTypeCount()和getItemViewType() 这两个方法.
其中 : getViewTypeCount() 的方法的作用 是也用来设置 LIstView 行视图的个数 一般大于或等于数据源;
getItemViewType() 的 方法 是用来根据position,来返回 不同位置的视图类型
下面是代码 用来显示七种不同的类型视图
public class ContentAdapter extends BaseAdapter { /** * 用户问题 */ public static final int USEEREQUESTION = 0; /** * 法律知识 */ public static final int LOWINFO = 1; /** * 参考答案 */ public static final int REFERENCE_ANSWERS = 2; /** * 诉讼请求 */ public static final int LITIGATION = 3; /** * 相关案例 */ public static final int CASE = 4; /** * 证据分析 */ public static final int EVIDENCE = 5; /** * 下载地址 */ public static final int DOWNLOAD = 6; private Context context; private String[] datas; private int width; private int height; public ContentAdapter(Context context, String[] datas) { this.context = context; this.datas = datas; } /** * 开发一个setWidth的方法 用来在做代码动态适配 * @param width 屏幕的宽 */ public void setWidth(int width) { this.width = width; } /** * 开发一个setHeight 方法 用来获取宽高进行代码的适配 * @param height 屏幕的高 */ public void setHeight(int height){ this.height = height; } @Override public int getCount() { // TODO: 填写数据源 return datas.length; } @Override public Object getItem(int position) { return datas[position]; } @Override public long getItemId(int position) { return position; } @Override public int getViewTypeCount() { // TODO: 2016/12/19 多种行视图的个数 一般大于数据源的个数 return super.getViewTypeCount() + datas.length; } @Override public int getItemViewType(int position) { if (position == DOWNLOAD) { return DOWNLOAD; } if (position == EVIDENCE) { return EVIDENCE; } if (position == CASE) { return CASE; } if (position == LITIGATION) { return LITIGATION; } if (position == REFERENCE_ANSWERS) { return REFERENCE_ANSWERS; } if (position == LOWINFO) { return LOWINFO; } else { return super.getItemViewType(position); } } @Override public View getView(int position, View convertView, ViewGroup parent) { LowInfoHolder lowInfoHolder = null; DownloadHolder downHolder = null; EvidenceHolder evidenceHolder = null; CaseHolder caseHOlder = null; LitigationHolder litigationHolder = null; AnswersHolder answersHolder = null; UserHolder userHolder = null; if (convertView == null) { switch (getItemViewType(position)) { case 0: convertView = View.inflate(context, R.layout.item_user_question, null); userHolder = new UserHolder(convertView); convertView.setTag(userHolder); break; case DOWNLOAD: convertView = View.inflate(context, R.layout.item_download, null); downHolder = new DownloadHolder(convertView); convertView.setTag(downHolder); break; case EVIDENCE: convertView = View.inflate(context, R.layout.item_evidence, null); evidenceHolder = new EvidenceHolder(convertView); convertView.setTag(evidenceHolder); break; case CASE: convertView = View.inflate(context, R.layout.item_case, null); caseHOlder = new CaseHolder(context, convertView); convertView.setTag(caseHOlder); break; case LITIGATION: convertView = View.inflate(context, R.layout.item_litigation, null); litigationHolder = new LitigationHolder(convertView); convertView.setTag(litigationHolder); break; case REFERENCE_ANSWERS: convertView = View.inflate(context, R.layout.item_answers, null); answersHolder = new AnswersHolder(convertView); convertView.setTag(answersHolder); break; case LOWINFO: convertView = View.inflate(context, R.layout.item_low_info, null); lowInfoHolder = new LowInfoHolder(context, convertView); convertView.setTag(lowInfoHolder); break; default: break; } } else { switch (getItemViewType(position)) { case 0: userHolder = (UserHolder) convertView.getTag(); break; case DOWNLOAD: downHolder = (DownloadHolder) convertView.getTag(); break; case EVIDENCE: evidenceHolder = (EvidenceHolder) convertView.getTag(); break; case CASE: caseHOlder = (CaseHolder) convertView.getTag(); break; case LITIGATION: litigationHolder = (LitigationHolder) convertView.getTag(); break; case REFERENCE_ANSWERS: answersHolder = (AnswersHolder) convertView.getTag(); break; case LOWINFO: lowInfoHolder = (LowInfoHolder) convertView.getTag(); break; default: break; } } return convertView; } }
上面的代码 还可以进行优化
在Adapter的getView() 中 对 Holder 进行抽取 把视图 交给Holder进行维护,这里面用到了 面向Holder 编程思想,以后再说!