MVP+RXJAVA+RecyclerView实现sd卡根目录下的所有文件中的照片加载并显示
初学Rxjava,目前只能遍历加载指定目录下的所有文件夹中的照片,文件夹中如果还嵌套有文件夹目前还没找到实现方法。
先看mvp目录结构:

很抱歉,没有model。
接下来是view层的接口代码和presenter层的接口代码
public interface IImgsView {
void onImgsLoadCompleted(ArrayList<String> imgs);
}
public interface IImgsPresenter {
void getImages(File[] files);
}
然后是图片显示的activity,实现IImgsView 接口,里面持有presenter对象
package com.create.qdocumentimtest.rxjavatest.view; import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager; import com.create.qdocumentimtest.R;
import com.create.qdocumentimtest.rxjavatest.adapter.MyRecyRxAdapter;
import com.create.qdocumentimtest.rxjavatest.presenter.IImgsPresenter;
import com.create.qdocumentimtest.rxjavatest.presenter.ImgPresenterCompl; import java.io.File;
import java.util.ArrayList; import butterknife.ButterKnife;
import butterknife.InjectView; /**
* 功能:使用mvp rxjava完成sd卡根目录中的所有子目录中的图片的加载,在recyclerView中以瀑布流形式显示。
*/
public class ThreeActivity extends AppCompatActivity implements IImgsView {
@InjectView(R.id.recyclerView)
RecyclerView recyclerView;
private String basePath;
private IImgsPresenter imgsPresenter;
private ArrayList<String> imgs = new ArrayList<>(); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_three);
ButterKnife.inject(this);
imgsPresenter = new ImgPresenterCompl(this);
basePath = Environment.getExternalStorageDirectory().getPath();
File file = new File(basePath);
File[] files = file.listFiles();
imgsPresenter.getImages(files);
} @Override
public void onImgsLoadCompleted(ArrayList<String> imgs) {//presenter加载完资源后回调
recyclerView.setLayoutManager(new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL));
MyRecyRxAdapter adapter=new MyRecyRxAdapter(this,imgs);
recyclerView.setAdapter(adapter);
}
}
接下来是presenter的实现类,负责处理代码的主要逻辑。
package com.create.qdocumentimtest.rxjavatest.presenter; import android.util.Log; import com.create.qdocumentimtest.rxjavatest.view.IImgsView; import java.io.File;
import java.util.ArrayList; import rx.Observable;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Func1;
import rx.schedulers.Schedulers; /**
* Created by Administrator on 2016/6/8 0008.
*/
public class ImgPresenterCompl implements IImgsPresenter {
private IImgsView imgsView;
private ArrayList<String> imgs=new ArrayList<>();
public ImgPresenterCompl(IImgsView imgsView) {
this.imgsView=imgsView;
}
@Override
public void getImages(File[] files) {
Observable.from(files)
.filter(new Func1<File, Boolean>() {//过滤文件夹,只选择文件夹,不选择其他文件(即便有图片也没法选择了)
@Override
public Boolean call(File file) {
return file.isDirectory();
}
})
.flatMap(new Func1<File, Observable<File>>() {
@Override
public Observable<File> call(File file) {//遍历文件夹
return Observable.from(file.listFiles());
}
})
.filter(new Func1<File, Boolean>() {//过滤图片,二级文件夹中的图片无法找出
@Override
public Boolean call(File file) {
return file.getName().endsWith(".png")||file.getName().endsWith(".jpg")||file.getName().endsWith(".jpeg");
}
})
.map(new Func1<File, String>() {
@Override
public String call(File file) {
return file.getPath();
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {//onnext()执行完后调用
Log.e("img","完成");
imgsView.onImgsLoadCompleted(imgs);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
Log.e("img",s);
imgs.add(s);
}
});
}
}
以下是recyclerView的adapter
package com.create.qdocumentimtest.rxjavatest.adapter; import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout; import com.bumptech.glide.Glide;
import com.create.qdocumentimtest.R;
import com.create.qdocumentimtest.rxjavatest.utils.Dp2pxUtils;
import com.create.qdocumentimtest.rxjavatest.utils.ImgUtils;
import com.create.qdocumentimtest.rxjavatest.utils.ScreenUtil; import java.util.ArrayList;
import java.util.List; import butterknife.ButterKnife;
import butterknife.InjectView; /**
* Created by Administrator on 2016/6/8 0008.
*/
public class MyRecyRxAdapter extends RecyclerView.Adapter<MyRecyRxAdapter.MyViewHolder>{
private Context context;
List<String> imgs;
public MyRecyRxAdapter(Context context, ArrayList<String> imgs) {
this.context = context;
this.imgs=imgs;
} @Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView=View.inflate(context, R.layout.item_recycle_rxjava_layout,null);
MyViewHolder vh=new MyViewHolder(itemView);
return vh;
} @Override
public void onBindViewHolder(MyViewHolder holder, int position) {
int showImageHeight = getShowImageHeight(position); LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) holder.imageView.getLayoutParams(); params.height=showImageHeight;
holder.imageView.setLayoutParams(params);
Glide.with(context).load(imgs.get(position)).into(holder.imageView);
//高度设置
} /**
* 获取条目高度
* @param position
* @return
*/
private int getShowImageHeight(int position) {
int width= ScreenUtil.getScreenWidth(context);
int height=ScreenUtil.getScreenHight(context);
int px= Dp2pxUtils.Dp2Px(context, 6);
int viewWidth = width / 3 - px;
int originalWidth = ImgUtils.getImgOriginalWidth(imgs.get(position));
int originalHeight = ImgUtils.getImgOriginalHeight(imgs.get(position));
return originalHeight * viewWidth / originalWidth;
} @Override
public int getItemCount() {
return imgs.size();
} class MyViewHolder extends RecyclerView.ViewHolder{
ImageView imageView;
public MyViewHolder(View itemView) {
super(itemView);
imageView= (ImageView) itemView.findViewById(R.id.image);
}
}
}
MVP+RXJAVA+RecyclerView实现sd卡根目录下的所有文件中的照片加载并显示的更多相关文章
- Android 读取手机SD卡根目录下某个txt文件的文件内容
1.先看activity_main.xml文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/and ...
- android setDestinationInExternalPublicDir 下载到SD卡根目录
一:setDestinationInExternalPublicDir(“Trinea”, “MeiLiShuo.apk”);表示设置下载地址为sd卡的Trinea文件夹,文件名为MeiLiShuo. ...
- FileUtils【获取SD卡根目录、读写文件、移动、复制、删除文件、获取文件名、后缀名操作类】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 封装了获取SD卡根目录路径.以及对文件读写.获取文件名等相关操作. 因为需要用到android.permission.READ_EX ...
- android 获取sd卡根目录
dir:/storage/emulated/0 也就是 sdcard目录 ====== android 获取sd卡根目录 public String getSDPath(){ File ...
- java 如何读取src根目录下的属性文件
在java项目中,如何获取src根目录下的属性文件/资源文件呢? 有如下三种方式: 方式一: InputStream in = Test.class .getResourceAsStream(&quo ...
- XRecyclerView:实现下拉刷新、滚动到底部加载更多以及添加header功能的RecyclerView
介绍: 一个实现了下拉刷新,滚动到底部加载更多以及添加header功能的的RecyclerView.使用方式和RecyclerView完全一致,不需要额外的layout,不需要写特殊的adater. ...
- [转载] linux查找目录下的所有文件中是否含有某个字符串
链接自 http://blog.sina.com.cn/s/blog_691a84f301015khx.html,并略加修订. 查找目录下的所有文件中是否含有某个字符串 find .|xargs gr ...
- linux查找目录下的所有文件中是否含有某个字符串
查找目录下的所有文件中是否含有某个字符串 find .|xargs grep -ri "IBM" find .|xargs grep -ri "IBM" -l ...
- 查找目录下的所有文件中是否含有某个字符串 linux
查找目录下的所有文件中是否含有某个字符串 find .|xargs grep -ri "IBM" 查找目录下的所有文件中是否含有某个字符串,并且只打印出文件名 find .|xar ...
随机推荐
- CentOS 学习笔记
整理基础的CentOS常用命令 http://os.51cto.com/art/201003/190801.htm 在Hyper-V中的CentOS虚拟机中使用网络 http://blog.earth ...
- ios9 升级后 企业版app plist无法安装
昨天apple推送了ios9, 公司的一些app是企业版的,平常通过 item-service 结果更改如下 plist可以了 itms-services://?action=download-man ...
- 关于Eclipse的unsupported major minor version 51.0 错误
把别人的工程 拿来运行报上述错误 是因为工程版本不对 解决办法:新建工程 把现有的代码或资源文件 拷到新建工程里
- java 笔记(5) —— 线程,yield,join
一.线程各个状态与转换: 新建状态:用new语句创建的线程对象处于新建状态,此时它和其它的java对象一样,仅仅在堆中被分配了内存 .就绪状态:当一个线程创建了以后,其他的线程调用了它的start() ...
- [原创]java WEB学习笔记57:Struts2学习之路---ActionSupport类的说明
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- 进击的java - tomcat的安装,配置都正确之后,还是报错
1.问题 配置Apatch Tomcat过程报错: The CATALINA_HOME environment variable is not defined correctly.This envir ...
- Java的正则表达式
package RegexTest; /** * Created by hu on 2016/3/29. */ /* * Java的正则表达式 在正则表达式中,用\d表示一位数字,如果在其它语言中使用 ...
- HDU 5002 Tree(动态树LCT)(2014 ACM/ICPC Asia Regional Anshan Online)
Problem Description You are given a tree with N nodes which are numbered by integers 1..N. Each node ...
- linux kernel.shmall shemax shemin 參數解釋
分类: oracle linux 2010-06-17 14:30 6193人阅读 评论(0) 收藏 举报 linuxoracleredhat数据库服务器x86 Linux X86-64操作系统,Or ...
- paper 39 :Matlab绘制误差棒图(errorbar函数的使用)
同很多非数学相关专业的朋友一样,我第一次碰到这个图时也是丈二和尚摸不着头脑.只知道这个工字型的图案,中间的点代表的是平均值,上下的两条横线代表的是方差值,除此之外,连这个图叫什么名字都不知道,只好硬着 ...