您的位置:首页 > 移动开发 > Android开发

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;
    }


这里写了主要思路.有什么说的不好的可以留言
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: