好看的皮囊千篇一律昵骤,有趣的靈魂100來斤宵睦。
RecyclerView按時間加載一天中的相似圖片
android小白一枚涯捻,最近公司讓做相似圖片處理的demo,經(jīng)過一個多月的查資料望迎、請教障癌,終于實現(xiàn)了功能,本人就開發(fā)中遇到的問題辩尊,并且把認(rèn)為對大家有幫助的地方寫下來涛浙,希望對大家有所幫助。
-
相冊中的圖片按照日期排列
這是開發(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(); } }); }
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é)果如圖所示:
總結(jié):第一次對RecyclerView有了這么深刻的認(rèn)識,對于一個小白來說馏臭,項目才是提升的最短捷徑野蝇。還有讼稚,沒有什么是一段代碼不能解決的,如果有绕沈,那就兩段锐想。