1. 程式人生 > >android 資料重構(仿淘寶瀏覽記錄,足跡)

android 資料重構(仿淘寶瀏覽記錄,足跡)

資料結構 ->資料重構

  • 原因
    處理這個資料的主要原因是,後臺伺服器返回的資料格式在ios那邊因為其控制元件可以對資料進行分割槽顯示,可以直接處理,而在android上我們顯示控制元件就是listview,只能按一條item一條item的顯示,因此分作兩個item的話需要,其他資料分類.
  • 需求:
    瀏覽時間分類瀏覽過的商品(與淘寶足跡一樣)
    這裡寫圖片描述
  • 問題:
    伺服器資料:
    1對1, 時間+item商品
    現在需求將資料分類成 : 1對多 時間+list商品
  • 分析:
    可以試用兩種方法1.使用一個item在item頭隱藏顯示時間, 2.使用兩個item 分類顯示時間
    ps:由於listview涉及到了item的刪除 因此第一種方式不可使用,那麼如果使用兩個item的話就需要對資料進行重構.
    重構成什麼樣子呢,
    1.使用treemap來分類資料TreeMap
   /**
     * 重構分類各個時間段資料結構
     * @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的設定如下
@Override
    public int getItemViewType(int position) {
        final Object data = list.get(position);
        return data instanceof String ? GOODS_TIME : GOODS_ITEM;
    }
  • 2.2由於treemap集合內比較的是自然排序,我們在這裡比較的是string時間,因此要實現他的比較方法
 /**
     * 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顯示時間的,但是隻可以顯示死資料,無法對其進行動態刪除
    /**
     * 同一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;
    }

這裡寫了主要思路.有什麼說的不好的可以留言