OkHttp+RecyclerView加载图片瀑布流

这里这个小Demo里面主要有OKHttp,

RecyclerView,picasso等开源库及网络框架;


首先添加需要用到的依赖:

  compile 'com.android.support:recyclerview-v7:26.0.0-alpha1'
    compile 'com.squareup.picasso:picasso:2.5.2'
    compile 'com.squareup.okhttp3:okhttp-ws:3.4.2'
    compile 'com.google.code.gson:gson:2.6.1'

权限:

<uses-permission android:name="android.permission.INTERNET"/>
主布局:

 <android.support.v4.widget.SwipeRefreshLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/swipeRefreshLayout">
        <android.support.v7.widget.RecyclerView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/recyclerView"/>
    </android.support.v4.widget.SwipeRefreshLayout>
item布局就不说了  就一个图片

主方法:

public class MainActivity extends AppCompatActivity {
    //获取的json数据中的数据集合
    private List<RootBean.美女Bean>  list = new ArrayList<>();

    //创建一个list集合存储recyclerview中的图片的高度
    private List<Integer> heights =  new ArrayList<>();

    //声明recyclerview引用
    private RecyclerView mRecyclerView;

    //声明自定义请求类
    private MyAdapter adapter;
    private SwipeRefreshLayout swipeRefreshLayout;


    //用插件自动生成初始化view代码的方法
    private void assignViews() {

        mRecyclerView= (RecyclerView) findViewById(R.id.recyclerView);
        swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipeRefreshLayout);
        //设置recyclerview要实现的类型为StaggeredGrid瀑布流类型
        //并再构造方法中指定列数3,纵向排列
        mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(3,RecyclerView.VERTICAL));

    }


    int page=0;
    //网络请求数据的网址
    private String url ="http://c.3g.163.com/recommend/getChanListNews?channel=T1456112189138&size=20&passport=&devId=1uuFYbybIU2oqSRGyFrjCw%3D%3D&lat=%2F%2FOm%2B%2F8ScD%2B9fX1D8bxYWg%3D%3D&lon=LY2l8sFCNzaGzqWEPPgmUw%3D%3D&version=9.0&net=wifi&ts=1464769308&sign=bOVsnQQ6gJamli6%2BfINh6fC%2Fi9ydsM5XXPKOGRto5G948ErR02zJ6%2FKXOnxX046I&encryption=1&canal=meizu_store2014_news&mac=sSduRYcChdp%2BBL1a9Xa%2F9TC0ruPUyXM4Jwce4E9oM30%3D";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化控件
        assignViews();

        //开启网络下载数据的方法
        startTask();
        //上拉刷新

        swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                page ++;
                loadData();
                adapter.notifyDataSetChanged();
                swipeRefreshLayout.setRefreshing(false);
            }
        });


    }

    private void loadData() {
        Toast.makeText(MainActivity.this,"下拉刷新",Toast.LENGTH_LONG).show();
        String img = list.get(0).img;
        adapter.addData(img);
    }

    private void startTask() {

        //通过类名直接调用静态方法获取单例对象再调用getBeanOfOK()方法传入参数通过接口回调获取数据
        OkHttpUtils.getInstance().getBeanOfOk(this, url, RootBean.class,
                new OkHttpUtils.CallBack<RootBean>() {
                    @Override
                    public void getData(RootBean rootBean) {


                        if(rootBean!=null){

                            //如果不为空用本地list接收
                            list.addAll(rootBean.美女);

                            //数据一旦回调成功初始化数据源和适配器
                            initHights();

                            initAdapter();
                        }
                    }
                });


    }

    private void initAdapter() {


        //创建自定义适配器对象
        adapter = new MyAdapter(this,list,heights);

        //设置recyclerview适配器
        mRecyclerView.setAdapter(adapter);
        //设置动画
        mRecyclerView.setItemAnimator(new DefaultItemAnimator());

        //刷新适配器
       // adapter.notifyDataSetChanged();
        adapter.setOnItemClickListener(new MyAdapter.onItemClickListener() {
            @Override
            public void onItemclic(View view, int data) {
                Toast.makeText(MainActivity.this,data+"",Toast.LENGTH_SHORT).show();

            }
        });

    }

    private void initHights() {
        //设置随机数
        Random random = new Random();

        for (int i = 0; i < list.size(); i++) {

            //集合中存储每个回调图片对应的随机高度
            heights.add(random.nextInt(200)+200);
        }

    }
}
OKHttpUtils:

//OkHttpUtils工具类,用于 用OkHttp框架获取网络数据并通过添加范型的静态方法返回不同
//bean对象的数据
public class OkHttpUtils {

    //声明OkHttpClient引用
    private OkHttpClient client;

    //私有化构造方法
    private OkHttpUtils(){

        //创建client对象只在创建OkHttpUitls对象时创建一次
        client = new OkHttpClient();

    }

    //声明静态OkHttpUtils引用
    private static OkHttpUtils utils;

    //单例设计模式让外部始终获得的是一个OkHttpUtils对象
    public static OkHttpUtils getInstance() {

        //双重判断加上同步锁可以解决线程安全问题
        if(utils==null){
            synchronized (OkHttpUtils.class){
                if(utils==null){

                    //一旦判断没有创建过此类的对象就创建一次并返回
                    utils = new OkHttpUtils();

                    return utils;
                }
            }
        }
        return utils;
    }

    //定义一个callback接口并定义范型(适用于任意类的返回对象)用于接口回调
    interface CallBack<T>{

        //定义回调方法
        void getData(T t);
    }

    //创建万能的数据请求类,形参为四个activity对象,网址url,和得到数据的bean类为范型的class对象,实现接口的类对象
    public <T extends Object>void getBeanOfOk(final Activity activity, String url, final Class<T> clazz, final CallBack<T> callback){

        //创建request请求对象,设置其方式get,网址url
        Request request = new Request.Builder().get().url(url).build();

        //通过client的newCall方法传入request,并调用enqueue求求数据
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {

                //通过返回的response对象的body()和string()方法得到获取的json字符串
                String json = response.body().string();

                //通过Gson解析得到解析后任意类对象
                final T t  = new Gson().fromJson(json,clazz);

                //由于子线程中不能更新UI所以我们用activity对象调用方法回到主线程
                activity.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        if(t!=null){
                            //并用过接口回调传回数据
                            callback.getData(t);
                        }
                    }
                });
            }
        });
    }
}

适配器:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {

    //声明两个集合用于接受构造方法传来的参数在本地使用
    private List<RootBean.美女Bean> list;

    private List<Integer> heights;

    //声明上下文引用,用于加载布局文件
    private Context context;

    //用构造方法传入需要的参数,
    public MyAdapter(Context context, List<RootBean.美女Bean> list, List<Integer> heights) {
        this.context = context;
        this.list = list;
        this.heights = heights;

    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //返回MyViewHolder对象,通过构造方法传入加载布局文件得到的view对象
        return new MyViewHolder(LayoutInflater.from(context).inflate(R.layout.item, parent, false));
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        //通过itemview得到每个图片的pararms对象
        RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) holder.itemView.getLayoutParams();

        //将高度修改为传入的随机高度
        params.height = heights.get(position);

        //设置修改参数
        holder.itemView.setLayoutParams(params);


//        holder.iv.setImageResource(R.mipmap.ic_launcher);

        //用过Picasso框架对图片处理并显示到iv上
        //用with()方法初始化,,
        Picasso.with(context)
                //load()下载图片
                .load(list.get(position).img)

                //下载中显示的图片
                .placeholder(R.mipmap.ic_launcher)

                //下载失败显示的图片
                .error(R.mipmap.ic_launcher)

                //init()显示到指定控件
                .into(holder.iv);
        ObjectAnimator
                .ofFloat(holder.iv,"alpha",0.0f,1.0f)
                .setDuration(2000)
                .start();
    }

    @Override
    public int getItemCount() {

        //返回数据源大小
        return list.size();
    }

    public void addData(String img) {
        RootBean.美女Bean 美女Bean = list.get(0);
        美女Bean.img=img;
        list.add(0,美女Bean);
    }


    //自定义MyViewHolder类用于复用
    class MyViewHolder extends RecyclerView.ViewHolder {

        //声明imageview对象
        private ImageView iv;

        //构造方法中初始化imageview对象
        public MyViewHolder(View itemView) {
            super(itemView);
            iv = itemView.findViewById(R.id.image);
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(monItemClickListener!=null){
                        monItemClickListener.onItemclic(v,getLayoutPosition());
                    }
                }
            });
        }
    }
    //点击事件recycleview点击事件的接口
    interface onItemClickListener{
        /**
         * 抽象方法,当recycleview某个被点击的时候回调
         * @param view  点击的item对象
         * @param data  点击时的数据
         */
        void onItemclic(View view,int data);

    }
    //创建接口
    private onItemClickListener monItemClickListener;

    //设置recycleview的某个监听
    public  void setOnItemClickListener(onItemClickListener onItemClickListener){
        monItemClickListener=onItemClickListener;

    }
}

这里有JavaBean类,就不需要写了;


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值