OkHttp网络获取数据通过RecycleView展示,实现ListView,GridView(网格布局),瀑布流效果展示

因为涉及到网络请求数据
那么首先我们先要在清单文件 添加网络权限,已经注册MyApp(设置图片的自定义类,需要注册)

  <uses-permission android:name="android.permission.INTERNET"/>
    <application
        android:name=".MyApp"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

接下来导入一下依赖

//OkHttp的依赖
 compile 'com.squareup.okhttp3:okhttp:3.4.2'
//gson的依赖
  implementation 'com.google.code.gson:gson:2.8.5'
//image-loader的依赖    
 implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'

MainActivity

package com.recycleview.recycleview;

import android.content.Context;
import android.os.Bundle;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.OrientationHelper;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import java.util.List;

import okhttp3.internal.Util;

public class MainActivity extends AppCompatActivity implements View.OnClickListener, OkHttpUtil.OkHttp {

    private Button add;
    private Button delete;
    private Button list;
    private Button grid;
    private Button flow;
    private RecyclerView recyclerview;
    private RecyclerViewAdapter mRecyclerViewAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();

        //创建适配器
        mRecyclerViewAdapter = new RecyclerViewAdapter(this);

        //封装网络请求工具类
        OkHttpUtil okHttpUtil = new OkHttpUtil(this);
        okHttpUtil.getOkHttp();
        //添加到适配器
        recyclerview.setAdapter(mRecyclerViewAdapter);

        //布局管理器
        recyclerview.setLayoutManager(new LinearLayoutManager(this,OrientationHelper.VERTICAL,false));


        //设置条目点击监听事件
        mRecyclerViewAdapter.setOnClickListener(new RecyclerViewAdapter.OnClickListener() {
            @Override
            public void OnClick(View view, int i) {
                Toast.makeText(MainActivity.this, mRecyclerViewAdapter.mData.get(i).getName()+"", Toast.LENGTH_SHORT).show();
            }
        });
        //添加分割线

        DividerItemDecoration divi = new DividerItemDecoration(this,1);
        //设置分割线样式  自定义样式
        divi.setDrawable(ContextCompat.getDrawable(this,R.drawable.shape));
        recyclerview.addItemDecoration(divi);


    }

    //获取控件资源id
    private void initView() {
        add = (Button) findViewById(R.id.add);
        delete = (Button) findViewById(R.id.delete);
        list = (Button) findViewById(R.id.list);
        grid = (Button) findViewById(R.id.grid);
        flow = (Button) findViewById(R.id.flow);
        recyclerview = (RecyclerView) findViewById(R.id.recyclerview);

        add.setOnClickListener(this);
        delete.setOnClickListener(this);
        list.setOnClickListener(this);
        grid.setOnClickListener(this);
        flow.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.add:
                mRecyclerViewAdapter.addData();
                break;
            case R.id.delete:
                mRecyclerViewAdapter.deleteData(mRecyclerViewAdapter.getItemCount());
                break;
            case R.id.list://使用ListView样式进行数据展示
                LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this,OrientationHelper.VERTICAL,false);
                recyclerview.setLayoutManager(linearLayoutManager);
                break;
            case R.id.grid://使用GridView(网格布局)样式进行数据展示
                GridLayoutManager gridLayoutManager = new GridLayoutManager(this,2);
                recyclerview.setLayoutManager(gridLayoutManager);
                break;
            case R.id.flow://使用瀑布流样式进行数据展示
                StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(3,OrientationHelper.VERTICAL);
                recyclerview.setLayoutManager(staggeredGridLayoutManager);
                break;
        }
    }

    @Override
    public void success(final List<DataItem.ResultBean> data) {
         runOnUiThread(new Runnable() {
             @Override
             public void run() {
              mRecyclerViewAdapter.setData(data);
             }
         });
    }

    @Override
    public void failtrue() {

    }
}

RecyclerViewAdapter适配器

package com.recycleview.recycleview;

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.nostra13.universalimageloader.core.ImageLoader;

import java.util.ArrayList;
import java.util.List;

/**
 * date:2018/11/14
 * author:李壮(HUAWEI)
 * function:
 */
class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {

    private Context mContext;
    public List<DataItem.ResultBean> mData;

    public RecyclerViewAdapter(Context context) {
        this.mContext = context;
        mData = new ArrayList<DataItem.ResultBean>();
    }
    public void setData(List<DataItem.ResultBean> data) {
        mData.clear();
        if (data != null){
            mData.addAll(data);
        }
        notifyDataSetChanged();
    }

    @NonNull
    @Override//创建ViewHolder
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = View.inflate(mContext,R.layout.recycleview_item,null);
        ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }

    //绑定视图
    @Override
    public void onBindViewHolder(@NonNull final ViewHolder viewHolder, final int i) {
         viewHolder.title.setText(mData.get(i).getName());
        ImageLoader.getInstance().displayImage(mData.get(i).getImageUrl(),viewHolder.icon,Config.disPlayCBD());
         viewHolder.linearLayout.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                 mOnClickListener.OnClick(v,i);
             }
         });
    }

    @Override
    public int getItemCount() {
        return mData.size();
    }

    //增加
    public void addData() {
        DataItem.ResultBean resultBean = new DataItem.ResultBean();
        //设置新添加的名称
        resultBean.setName("Lz");
        //设置新添加的图片
        resultBean.setImageUrl("http://172.17.8.100/images/movie/stills/ws/ws1.jpg");
        mData.add(resultBean);
        //刷新
        notifyDataSetChanged();
    }

    //删除
    public void deleteData(int itemCount) {
         if (itemCount == 1){
             //当条目只剩最后一条数据时提示用户
             Toast.makeText(mContext, "已经最后一条数据了", Toast.LENGTH_SHORT).show();
         }else {
             //执行删除操作
             mData.remove(itemCount - 1);
             //刷新
             notifyDataSetChanged();
         }
    }


    public class ViewHolder extends RecyclerView.ViewHolder {
        private ImageView icon;
        private TextView title;
        private LinearLayout linearLayout;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            icon = itemView.findViewById(R.id.icon);
            title = itemView.findViewById(R.id.title);
            linearLayout = itemView.findViewById(R.id.linearLayout);

        }
    }

    /////////////使用接口进行设置条目点击监听事件////////////
    public interface OnClickListener{
        void OnClick(View view,int i);
    }
    private OnClickListener mOnClickListener;
    public void setOnClickListener(OnClickListener onClickListener){
        mOnClickListener = onClickListener;
    }
}

封装网络请求工具类 OKHttp网络请求

package com.recycleview.recycleview;

import com.google.gson.Gson;

import java.io.IOException;
import java.util.List;
import java.util.concurrent.TimeUnit;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

/**
 * date:2018/11/14
 * author:李壮(HUAWEI)
 * function:
 */
class OkHttpUtil {

    private String path = "http://172.17.8.100/movieApi/movie/v1/findHotMovieList?count=10&page=1";

    public void getOkHttp(){
        //创建OkHttpClient对象,设置读取,写入,连接超时
        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .readTimeout(10,TimeUnit.SECONDS)
                .writeTimeout(10,TimeUnit.SECONDS)
                .connectTimeout(10,TimeUnit.SECONDS)
                .build();
        //创建Request对象,设置请求方式,请求接口地址
        Request request = new Request.Builder()
                .get()
                .url(path)
                .build();
        //创建Call对象
        Call call = okHttpClient.newCall(request);
        //通过call调用enqueue方法 完成网络请求
        call.enqueue(new Callback() {
            //请求失败时调用该方法
            @Override
            public void onFailure(Call call, IOException e) {
              mOkHttp.failtrue();
            }

            //请求成功时调用该方法
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                String result = response.body().string();
                DataItem dataItem = new Gson().fromJson(result, DataItem.class);
                List<DataItem.ResultBean> data = dataItem.getResult();
                mOkHttp.success(data);
            }
        });
    }

    public OkHttpUtil(OkHttp okHttp) {
        mOkHttp = okHttp;
    }

    ///////////////////////接口回调///////////////
    public interface OkHttp{
        void success(List<DataItem.ResultBean> data);
        void failtrue();
    }
    private OkHttp mOkHttp;

    public void setOkHttp(OkHttp okHttp) {
        mOkHttp = okHttp;
    }
}

自定义类 设置图片缓存

package com.recycleview.recycleview;

import android.app.Application;

import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;

/**
 * date:2018/11/15
 * author:李壮(HUAWEI)
 * function:
 */
public class MyApp extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        ImageLoaderConfiguration imageLoaderConfiguration = new ImageLoaderConfiguration.Builder(this)
                //设置缓存磁盘大小
                .diskCacheSize(50*1024*1024)
                //设置缓存内存大小
                .memoryCacheSize(10)
                //设置图片展示样式
                .defaultDisplayImageOptions(Config.disPlayCBD())
                .build();
        ImageLoader.getInstance().init(imageLoaderConfiguration);
    }
}

设置图片显示样式

package com.recycleview.recycleview;

import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.display.CircleBitmapDisplayer;

/**
 * date:2018/11/15
 * author:李壮(HUAWEI)
 * function:
 */
public class Config {

    //正常默认形状
    public static DisplayImageOptions disPlay(){
        DisplayImageOptions displayImageOptions = new DisplayImageOptions.Builder()
                //是否缓存到磁盘
                .cacheOnDisk(true)
                //是否缓存到内存
                .cacheInMemory(true)
                //设置图片加载状态
                //加载中
                .showImageOnLoading(R.drawable.ic_launcher_background)
                //加载成功
                .showImageOnFail(R.drawable.ic_launcher_background)
                //加载失败
                .showImageForEmptyUri(R.drawable.ic_launcher_background)
                .build();
        return displayImageOptions;
    }
    //设置图片为圆形
    public static DisplayImageOptions disPlayCBD(){
        DisplayImageOptions displayImageOptions = new DisplayImageOptions.Builder()
                //是否缓存到磁盘
                .cacheOnDisk(true)
                //是否缓存到内存
                .cacheInMemory(true)
                //设置图片加载状态
                //加载中
                .showImageOnLoading(R.drawable.ic_launcher_background)
                //加载成功
                .showImageOnFail(R.drawable.ic_launcher_background)
                //加载失败
                .showImageForEmptyUri(R.drawable.ic_launcher_background)
                //设置图片样式为圆形
                .displayer(new CircleBitmapDisplayer())
                .build();
        return displayImageOptions;
    }
}

Bean类

package com.recycleview.recycleview;

import java.util.List;

/**
 * date:2018/11/14
 * author:李壮(HUAWEI)
 * function:
 */
class DataItem {
    private String message;
    private String status;
    private List<ResultBean> result;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public List<ResultBean> getResult() {
        return result;
    }

    public void setResult(List<ResultBean> result) {
        this.result = result;
    }

    public static class ResultBean {
        private boolean followMovie;
        private int id;
        private String imageUrl;
        private String name;
        private int rank;
        private String summary;

        public boolean isFollowMovie() {
            return followMovie;
        }

        public void setFollowMovie(boolean followMovie) {
            this.followMovie = followMovie;
        }

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public String getImageUrl() {
            return imageUrl;
        }

        public void setImageUrl(String imageUrl) {
            this.imageUrl = imageUrl;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getRank() {
            return rank;
        }

        public void setRank(int rank) {
            this.rank = rank;
        }

        public String getSummary() {
            return summary;
        }

        public void setSummary(String summary) {
            this.summary = summary;
        }
    }
}

自定义shape 设置分割线的显示样式

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">

<gradient
    android:startColor="#ffff0000"
    android:centerColor="#ff00ff"
    android:endColor="#fff000"
    android:type="linear"/>
<size android:height="3dp"/>
</shape>

布局文件1 主页面布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <Button
            android:id="@+id/add"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="添加"/>
        <Button
            android:id="@+id/delete"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="删除"/>
        <Button
            android:id="@+id/list"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="List"/>
        <Button
            android:id="@+id/grid"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="Grid"/>
        <Button
            android:id="@+id/flow"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="Flow"/>
    </LinearLayout>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerview"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </android.support.v7.widget.RecyclerView>
</LinearLayout>

布局文件2 具体网络请求数据展示的样式布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="match_parent"
    android:id="@+id/linearLayout">

   <ImageView
       android:id="@+id/icon"
       android:layout_width="100dp"
       android:layout_height="100dp"
       android:src="@mipmap/ic_launcher"/>
    <TextView
        android:id="@+id/title"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="标题"/>
</LinearLayout>

如果大家有什么好的建议可以在下方评论,大家一起讨论学习哦.

猜你喜欢

转载自blog.csdn.net/LZ0419/article/details/84103155