android 数据重构(仿淘宝浏览记录,足迹)
2015-12-09 18:55
489 查看
数据结构 ->数据重构
原因处理这个数据的主要原因是,后台服务器返回的数据格式在ios那边因为其控件可以对数据进行分区显示,可以直接处理,而在android上我们显示控件就是listview,只能按一条item一条item的显示,因此分作两个item的话需要,其他数据分类.
需求:
浏览时间分类浏览过的商品(与淘宝足迹一样)
问题:
服务器数据:
1对1, 时间+item商品
现在需求将数据分类成 : 1对多 时间+list商品
分析:
可以试用两种方法1.使用一个item在item头隐藏显示时间, 2.使用两个item 分类显示时间
ps:由于listview涉及到了item的删除 因此第一种方式不可使用,那么如果使用两个item的话就需要对数据进行重构.
重构成什么样子呢,
1.使用treemap来分类数据TreeMap
[code] /** * 重构分类各个时间段数据结构 * @param list * @return */ public List<Object> pickCategorys(List<GoodsInfo> list) { newGoodsMap.clear(); newGoodsList.clear(); for (GoodsInfo info : list) { String day = info.getCreateDay(); List<GoodsInfo> infos = newGoodsMap.get(day); if (infos == null) { infos = new ArrayList<>(); infos.add(info); newGoodsMap.put(day, infos); } else { infos.add(info); } } //将分好类的数据重新存储,做为adapter的数据源 final Set<String> keys = newGoodsMap.keySet(); for (String key : keys) { newGoodsList.add(key); newGoodsList.addAll(newGoodsMap.get(key)); } return newGoodsList; }
2.1adapter的设置如下
[code]@Override public int getItemViewType(int position) { final Object data = list.get(position); return data instanceof String ? GOODS_TIME : GOODS_ITEM; }
2.2由于treemap集合内比较的是自然排序,我们在这里比较的是string时间,因此要实现他的比较方法
[code] /** * treemap 分类数据容器 * 对key 进行倒序 */ public final TreeMap<String, List<GoodsInfo>> newGoodsMap = new TreeMap<>(new Comparator<String>() { @Override public int compare(String the, String another) { SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); try { Date dt1 = df.parse(the); Date dt2 = df.parse(another); return dt2.compareTo(dt1);//直接compareTo // if (dt1.getTime() > dt2.getTime()) { // SLog.d("dt1在dt2后"); // return -1; // } else if (dt1.getTime() < dt2.getTime()) { // SLog.d("dt1 在dt2前"); // return 1; // } else { // return 0; // } } catch (Exception exception) { exception.printStackTrace(); } return 0; } }); /** * 重新分类后的数据源包含(title_time + goods_item) */ private List<Object> newGoodsList = new ArrayList<>();
3.下面是第二种方式同一item显示时间的,但是只可以显示死数据,无法对其进行动态删除
[code] /** * 同一item 数据分类 * @param list * @return */ public HashMap<String, Integer> pickCategory(List<GoodsInfo> list) { HashMap<String, Integer> result = new HashMap<String, Integer>(); for (int i = 0; i < list.size(); i++) { if (result.containsKey(list.get(i).getCreateDay())) { } else { result.put(list.get(i).getCreateDay(), i); } } return result; }
这里写了主要思路.有什么说的不好的可以留言
相关文章推荐
- Android实现点击事件和长点击事件共存
- Android学习笔记(8):ViewGroup类
- Android自动检测版本及自动升级
- 源码探索系列2---深入解析AsyncTask
- Android制作粒子爆炸特效
- Android中R文件丢失问题解决办法
- android studio No resource found that matches the given name 找不到图片
- android AIDL技术的简单演示
- android RecyclerView 使用完全解析 介绍(二)
- 【Android开发学习笔记】【高级】【随笔】插件化——Activity生命周期
- Android-Activity所应该了解的大概就这样。(下)
- Android 6.0 Changes
- Android-Activity所应该了解的大概就这样。(上)
- Android-Activity所应该了解的大概就这样。(中)
- Android Proguard 详解
- android - open failed: EROFS (Read-only file system)
- 我的Android进阶之旅------>android Button上面的英文字符串自动大写的问题解决
- Java(Android)线程池
- Android Studio----Material Design---Data Binding系列
- 安装Android SDK并测试Hello World回忆总结