2018-11-26

好看的皮囊千篇一律昵骤,有趣的靈魂100來斤宵睦。

RecyclerView按時間加載一天中的相似圖片

android小白一枚涯捻,最近公司讓做相似圖片處理的demo,經(jīng)過一個多月的查資料望迎、請教障癌,終于實現(xiàn)了功能,本人就開發(fā)中遇到的問題辩尊,并且把認(rèn)為對大家有幫助的地方寫下來涛浙,希望對大家有所幫助。

  1. 相冊中的圖片按照日期排列
    這是開發(fā)中遇到的第一個問題摄欲,效果如圖所示


    image.png

    當(dāng)前android比較流行的Rxjava可以輕松解決這個問題轿亮,代碼如下:

    // 重要:獲取數(shù)據(jù)
    private void initData() {
        List<File> fileList = TaHelper.getInstance().getSrcFiles();
        Observable.fromIterable(fileList)
                .flatMapIterable(new Function<File, Iterable<File>>() {
                    @Override
                    public Iterable<File> apply(File file) throws Exception {
                        return Arrays.asList(file.listFiles());
                    }
                })
                .filter(new Predicate<File>() {
                    @Override
                    public boolean test(File it) throws Exception {
                        return it.getName().endsWith(".jpg") || it.getName().endsWith(".mp4");
                    }
                })
                .map(new Function<File, AlbumBean>() {
                    @Override
                    public AlbumBean apply(File file) throws Exception {
                        Date fileDate = FileUtils.parseDate(file);
                        cal1.setTime(fileDate);
                        // 將時分秒,毫秒域清零
                        cal1.set(Calendar.HOUR_OF_DAY, 0);
                        cal1.set(Calendar.MINUTE, 0);
                        cal1.set(Calendar.SECOND, 0);
                        cal1.set(Calendar.MILLISECOND, 0);
                        AlbumBean albumBean = new AlbumBean();
                        albumBean.date = cal1.getTime().getTime();
                        albumBean.path = file.getAbsolutePath();
                        return albumBean;
                    }
                })
                .collect(new Callable<List<TimeBean>>() {
                    @Override
                    public List<TimeBean> call() throws Exception {
                        return new ArrayList<>();
                    }
                }, new BiConsumer<List<TimeBean>, AlbumBean>() {
                    @Override
                    public void accept(List<TimeBean> timeBeans, AlbumBean albumBean) throws Exception {
                        TimeBean timeBean = new TimeBean();
                        timeBean.setDate(albumBean.date);
                        int index = timeBeans.indexOf(timeBean);
                        if (index >= 0) {
                            timeBeans.get(index).itemList.add(albumBean);
                        } else {
                            timeBean.itemList.add(albumBean);
                            timeBeans.add(timeBean);
                        }
                    }
                })
                .subscribeOn(Schedulers.io())
                .observeOn(Schedulers.io())
                .subscribe(new BiConsumer<List<TimeBean>, Throwable>() {
                    @Override
                    public void accept(List<TimeBean> timeBeans, Throwable throwable) throws Exception {
                        mData.addAll(timeBeans);
                        sortList();
    
                        //按時間處理后找到所有相似的圖片
                        addsimilarPicture();
                        searchMQPic();
                        findMaxQua();
                    }
                });
    } 
    
    
  2. RecyclerView中每個item怎么加載多張圖片
    這個是困擾時間最長的問題,我們知道Recyclerview可以加載不同的ViewType胸墙,但是我們知道手機每天拍照的圖片數(shù)量是不能確定的我注,每一天可能會有1~N張圖片,設(shè)置多個item也是麻煩且不實用的一件事迟隅。經(jīng)過查詢和請教但骨,最后在TimeAlbum項目中找到了解決方法,現(xiàn)在分享給大家智袭。
    TimeAlbum利用的是代理adapter方法奔缠,就是在RecyclerView 的adapter中運用一個代理Adapter,在代理的Adapte中在設(shè)置一個RecyclerView來橫向加載某一天的所有圖片吼野。不得不說校哎,作為一個android小白,這個思路以前真的沒有聽過瞳步,只是會簡單的使用RecyclerView來相同格式的item
    RecyclerView的adapter如下:

class TimeAdapter extends IbbListDelegateAdapter<List<TimeBean>> {

    private TimeDelegate timeDelegate;
    public TimeAdapter(List<TimeBean> data) {
        addDelegate();
        setItems(data);
    }

    private void addDelegate() {
        timeDelegate = new TimeDelegate();
        delegatesManager.setFallbackDelegate(timeDelegate);
    }

}
 class TimeDelegate extends AbsFallbackAdapterDelegate<List<TimeBean>> {


    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent) {
        return new TimeDelegateHolder(new TaTimeView(parent.getContext()));
    }

    @Override
    public void onBindViewHolder(@NonNull List<TimeBean> items, int position, @NonNull RecyclerView.ViewHolder holder, @NonNull List<Object> payloads) {
        super.onBindViewHolder(items, position, holder, payloads);
        TimeDelegateHolder albumHolder = (TimeDelegateHolder) holder;
        albumHolder.timeView.notify(items.get(position));
    }

    static class TimeDelegateHolder extends RecyclerView.ViewHolder {
        TaTimeView timeView;

        public TimeDelegateHolder(TaTimeView itemView) {
            super(itemView);
            timeView = itemView;
        }
    }
}

其中TaTimeView是一個自定義布局

class TaTimeView extends LinearLayout {
    public TaTimeView(Context context) {
        this(context, null);
    }

    public TaTimeView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        initView();
    }
    private ITaDecoration decoration;
    private AlbumAdapter adapter;
    private List<AlbumBean> data = new ArrayList<>();

    private void initView() {
        setOrientation(VERTICAL);

        decoration = TaHelper.getInstance().getDecoration();
        if (decoration == null) {
            decoration = new TaDecoration(getContext());
        }
        LayoutParams params = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        if (decoration != null) {
            addView(decoration.buildView(), params);
        }
        RecyclerView rcView = new RecyclerView(getContext());
        params = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 0);
        params.weight = 1;

        addView(rcView, params);

        adapter = new AlbumAdapter(data);
        GridLayoutManager gridLayoutManager = new GridLayoutManager(getContext(), 4);
        rcView.setLayoutManager(gridLayoutManager);
        rcView.setAdapter(adapter);
        rcView.addItemDecoration(new GridDecoration(4, 5, true));
    }

    public void notify(TimeBean timeBean) {
        decoration.showDate(timeBean.date);
        int size = timeBean.itemList.size();
        decoration.showNum(size);
        data.clear();
        data.addAll(timeBean.itemList);
        adapter.notifyDataSetChanged();
    }
} 

后面的相似圖片的判定以及相似圖片中怎么尋找質(zhì)量最好的圖片是leader給的接口闷哆,本人只是使用了一下,這里就不作介紹了谚攒。上面是核心代碼阳准,結(jié)果如圖所示:


image.png

總結(jié):第一次對RecyclerView有了這么深刻的認(rèn)識,對于一個小白來說馏臭,項目才是提升的最短捷徑野蝇。還有讼稚,沒有什么是一段代碼不能解決的,如果有绕沈,那就兩段锐想。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市乍狐,隨后出現(xiàn)的幾起案子赠摇,更是在濱河造成了極大的恐慌,老刑警劉巖浅蚪,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件藕帜,死亡現(xiàn)場離奇詭異,居然都是意外死亡惜傲,警方通過查閱死者的電腦和手機洽故,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盗誊,“玉大人时甚,你說我怎么就攤上這事」猓” “怎么了荒适?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長开镣。 經(jīng)常有香客問我刀诬,道長,這世上最難降的妖魔是什么哑子? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任舅列,我火速辦了婚禮,結(jié)果婚禮上卧蜓,老公的妹妹穿的比我還像新娘帐要。我一直安慰自己,他們只是感情好弥奸,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布榨惠。 她就那樣靜靜地躺著,像睡著了一般盛霎。 火紅的嫁衣襯著肌膚如雪赠橙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天愤炸,我揣著相機與錄音期揪,去河邊找鬼。 笑死规个,一個胖子當(dāng)著我的面吹牛凤薛,可吹牛的內(nèi)容都是我干的姓建。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼缤苫,長吁一口氣:“原來是場噩夢啊……” “哼速兔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起活玲,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤涣狗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后舒憾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體镀钓,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年镀迂,在試婚紗的時候發(fā)現(xiàn)自己被綠了掸宛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡招拙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出措译,到底是詐尸還是另有隱情别凤,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布领虹,位于F島的核電站规哪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏塌衰。R本人自食惡果不足惜诉稍,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望最疆。 院中可真熱鬧杯巨,春花似錦、人聲如沸努酸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽获诈。三九已至仍源,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間舔涎,已是汗流浹背笼踩。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留亡嫌,地道東北人嚎于。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓掘而,卻偏偏與公主長得像,于是被迫代替她去往敵國和親匾旭。 傳聞我的和親對象是個殘疾皇子镣屹,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)价涝,斷路器女蜈,智...
    卡卡羅2017閱讀 134,656評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,118評論 25 707
  • 回到姥姥家之后,我心里也真是放松了色瘩,動不動就10點多睡著伪窖,夜里起都起不來,白天騰騰不讓我看手機居兆,這日記也被迫中斷了...
    文娟_f閱讀 288評論 0 0
  • 落葉從遠方落下 掉落在了湖面上 泛起了波瀾 落葉從落寞人面前掉下 掉落在土地上 但為何那人的心 也在波瀾 和那落葉一樣呢
    追蘿卜的男孩閱讀 156評論 2 2
  • 引言:關(guān)于財富這個話題魏割,很容易引起階級紛爭,首先聲明钢颂,大家都是底層的屁民钞它,何苦為難自己人?前段時間跟公司幾個人聊天...
    7a0a64e35bf0閱讀 773評論 0 0