最近项目中需要使用到 分组展示数据的形式,借鉴了网上前辈们的 精华,现写一点总结,留作个人查看。
-
首先 为了给ListView 中填充数据定义 List<BaseInfo> datas = new ArrayList<BaseInfo>();
-
BaseInfo 中首先需要定义一个className 来区别 类别,以便进行展示
-
在每组 数据存放之前,先往datas 中存放一个 只有 className 不为空的 BaseInfo对象,然后再把该组数据存放到datas中
-
然后按照 Adapter 填充数据的形式进行填充数据
-
在 Adapter 中需要 针对 只有 className 不为空的BaseInfo 对象,引入相应的布局文件
以上即为 ListView 分组的逻辑思路
以下为个人使用部分代码:
Activity中的 数据处理 代码:
JSONArray array_obj = response .getJSONArray("obj"); for (int i = 0; i < array_obj.length(); i++) { JSONObject obj = array_obj.getJSONObject(i); String className = obj.getString("name"); String classId = obj.getString("id"); JSONArray array = obj .getJSONArray("appProductClientDTOList"); if (array.length() == 0) { // do nothing } else { BaseInfo base = new BaseInfo(); base.setClassName(className); base.setClassId(classId); datas.add(base); for (int j = 0; j < array.length(); j++) { BaseInfo baseInfo = new BaseInfo(); // 数据获取 baseInfo.setClassName(className); baseInfo.setClassId(classId); baseInfo.setScale(scale); baseInfo.setAppId(appId); baseInfo.setDownloadNumber(downloadCounts); baseInfo.setVersionCode(Integer .parseInt(versionCode)); baseInfo.setSize(appSize); baseInfo.setDownloadUrl(appFilePath); baseInfo.setPackageName(packageName); baseInfo.setName(name); datas.add(baseInfo); } } }
数据填充完毕后 填充Adapter :
adapter = new SplitClassAdapter(getApplicationContext(), datas); adapter.notifyDataSetChanged(); list_classes.setAdapter(adapter);
Adapter中 处理逻辑:
if (mDatas.get(position).getName()==null) { views = LayoutInflater.from(mcontext).inflate(R.layout.activity_header, group,false); header = new ViewHolderHeader(); // ViewHolderHeader 的 组件初始化,若有处理事件,也相应的在此实现 。 }else{ views = LayoutInflater.from(mcontext).inflate(R.layout.item_class, group,false); content = new ViewHolderContent(); //ViewHolderContent 的组件初始化,若有处理事件,也相应在此实现。
另外需要在Adapter 中 implement areAllItemsEnabled和 isEnabled 两个方法
@Override public boolean areAllItemsEnabled() { return true; } @Override public boolean isEnabled(int position) { // 如果-开头,则该项不可选 BaseInfo baseInfo = mDatas.get(position); if (baseInfo.getName()==null) { return false; }else{ return true; } }