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);
        }
    }
}
时间: 2024-10-21 08:11:49

MVP+RXJAVA+RecyclerView实现sd卡根目录下的所有文件中的照片加载并显示的相关文章

android setDestinationInExternalPublicDir 下载到SD卡根目录

一:setDestinationInExternalPublicDir(“Trinea”, “MeiLiShuo.apk”);表示设置下载地址为sd卡的Trinea文件夹,文件名为MeiLiShuo.apk.设置下载路径接口为setDestinationUri,setDestinationInExternalFilesDir,setDestinationToSystemCache.其中setDestinationToSystemCache仅限系统app使用. 二:DownloadManager下

Android 使用Log4j把日志写入SD卡,动态修改输出文件名称

一.Log4j简单使用 1. 下载log4j.jar http://logging.apache.org/log4j/2.x/ 2. 创建Java代码 public class Loggers { public static Logger logger = Logger. getLogger(Loggers. class); public static void init() { try { PatternLayout patternLayout = new PatternLayout(); p

查找目录下的所有文件中是否含有某个字符串 linux

查找目录下的所有文件中是否含有某个字符串 find .|xargs grep -ri "IBM" 查找目录下的所有文件中是否含有某个字符串,并且只打印出文件名 find .|xargs grep -ri "IBM" -l 1.正则表达式    (1)正则表达式一般用来描述文本模式的特殊用法,由普通字符(例如字符a-z)以及特殊字符(称为元字符,如/.*.?等)组成.   (2)基本元字符集及其含义       ^ :只匹配行首.   如^a 匹配以a开头的行abc,

linux查找目录下的所有文件中是否含有某个字符串

查找目录下的所有文件中是否含有某个字符串 find .|xargs grep -ri "IBM" find .|xargs grep -ri "IBM" -l \ :只用来屏蔽一个元字符的特殊含义. 如\*,\',\",\|,\+,\^,\. 等       .:(点)只匹配任意单字符.       pattern\{n\}:只用来匹配前面pattern出现的次数.n为次数.如a\{2\}匹配aa.       pattern\{n,\}:含义同上,但次数

linux查找目录下的所有文件中是否含有某个字符串 &lt;zhuan&gt;

查找目录下的所有文件中是否含有某个字符串 find .|xargs grep -ri "IBM" 查找目录下的所有文件中是否含有某个字符串,并且只打印出文件名 find .|xargs grep -ri "IBM" -l 1.正则表达式 (1)正则表达式一般用来描述文本模式的特殊用法,由普通字符(例如字符a-z)以及特殊字符(称为元字符,如/.*.?等)组成. (2)基本元字符集及其含义 ^ :只匹配行首. 如^a 匹配以a开头的行abc,a2e,a12,aaa,.

IOS嵌套界面下 -UIWebView加载网页显示不全(尺寸适应问题)

最近有个朋友碰到一个关于在嵌套界面下UIWebView加载网页显示不全的问题 咋一看这种问题太easy了.但是不要忽视其背后的真正黑手,现在拿百度首页做个实验(百度就是这点好)先贴上一小段核心代码: 显示效果: 看到没 显示不全.现在你会说快用大招: 解决它.可惜这招也不行. 原因分析:为什么会显示不全呢? 主要问题就出在前面说的关于在嵌套界面下. 可为什么在嵌套界面下就不行呢? 显示不全是个问题. 是的 是个问题而且是个显示界面尺寸不匹配的问题.可在主界面就这可以, 而且frame我都是用的s

Android打造(ListView、GridView等)通用的下拉刷新、上拉自动加载的组件

前言 下拉刷新组件在开发中使用率是非常高的,基本上联网的APP都会采用这种方式.对于开发效率而言,使用获得大家认可的开源库必然是效率最高的,但是不重复发明轮子的前提是你得自己知道轮子是怎么发明出来的,并且自己能够实现这些功能.否则只是知道其原理,并没有去实践那也就是纸上谈兵了.做程序猿,动手做才会遇到真正的问题,否则就只是自以为是的认为自己懂了.今天这篇文章就是以自己重复发明轮子这个出发点而来的,通过实现经典.使用率较高的组件来提高自己的认识.下面我们就一起来学习吧. 整体布局结构      

ListView下拉刷新,上拉自动加载更多

下拉刷新,Android中非常普遍的功能.为了方便便重写的ListView来实现下拉刷新,同时添加了上拉自动加载更多的功能.设计最初是参考开源中国的Android客户端源码.先看示例图.          图1                                                                                                             图2          图3                      

在某个目录下的所有文件中查找包含某个字符串的Windows命令

findstr可以完成这个工作. findstr /s /i "string" *.*   上面的命令表示,当前目录以及当前目录的所有子目录下的所有文件中查找"string"这个字符串. *.*表示所有类型的文件. /s 表示当前目录以及所有子目录 /i 表示不区分大小写 可以参考help findstr的输出解释来使用此命令. 注意: findstr.exe一般在C:\Windows\System32目录下,要从任意路径调用该命令,需要将C:\Windows\Sy