OkHttp+RecycleView展示网络数据

原创 2018年04月16日 14:58:53

1、依赖,权限

compile 'com.android.support:recyclerview-v7:26.0.0-alpha1'
compile 'com.squareup.okhttp3:okhttp:3.8.1'
compile 'com.google.code.gson:gson:2.8.2'
compile 'com.github.bumptech.glide:glide:3.5.2'
<uses-permission android:name="android.permission.INTERNET"/>

2、布局

activity_layout、

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

item、

<ImageView
    android:layout_width="match_parent"
    android:layout_height="100dp"
    android:id="@+id/iv"
    android:src="@mipmap/ic_launcher"
    />
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/tv"
    android:textSize="20sp"
    android:text="1111" />

3、News(封装接口数据)


4、OkhttpUtils(网络请求数据接口类)

import android.os.Handler;
import android.os.Message;
import com.google.gson.Gson;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class OkhttpUtils {
    private Handler hand=new Handler();
    private NetDataCallback netDataCallback;
    public <T>void getdata(String url, final NetDataCallback netDataCallback, final Class<T> tclass) {
        //初始化一个 OkHttpClient 并且设置连接和读取超时时间
        OkHttpClient okhttp=new OkHttpClient.Builder()
                .connectTimeout(10, TimeUnit.SECONDS)
                .readTimeout(20, TimeUnit.SECONDS)
                .build();
        Request request=new Request.Builder().url(url).build();
        Call call = okhttp.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                netDataCallback.fail(499,e.getMessage());
            }
            //请求成功
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                Gson gson=new Gson();
                T t = gson.fromJson(response.body().string(), tclass);
                final Message msg = Message.obtain();
                /*msg.what=ok;*/
                msg.obj=t;
                hand.post(new Runnable() {
                    @Override
                    public void run() {
                        netDataCallback.success(msg.obj);
                    }
                });
            }
        });
    }
}


5、NetDataCallback(接口类)

public interface NetDataCallback<T> {
    void success(T t);
    void fail(int code,String str);
}
6、Myadapter(适配器)
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.bumptech.glide.Glide;

import java.util.ArrayList;

public class Myadapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private ArrayList<News.DataBean> mlist=new ArrayList<News.DataBean>();
    private Context mcontext;
    public Myadapter(ArrayList<News.DataBean> mlist, Context mcontext) {
        this.mlist = mlist;
        this.mcontext = mcontext;
    }
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(mcontext);
        View view = inflater.inflate(R.layout.item, parent, false);
        RecyclerView.ViewHolder holder=null;
        holder=new ViewHolder(view);
        return holder;
    }
    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        //先进行强转
        ViewHolder holder1 = (ViewHolder) holder;
        //绑定数据
        holder1.tv.setText(mlist.get(position).getContent());
        Glide.with(mcontext).load(mlist.get(position).getUser().getIcon()).into(holder1.iv);
    }
    @Override
    public int getItemCount() {
        return mlist==null?0:mlist.size();
    }
    //定义一个ViewHolder
    class ViewHolder extends RecyclerView.ViewHolder{
        private TextView tv;
        private ImageView iv;
        public ViewHolder(View itemView) {
            super(itemView);
            tv=(TextView)itemView.findViewById(R.id.tv);
            iv=(ImageView)itemView.findViewById(R.id.iv);
        }
    }
}

7、MainActivity

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity implements NetDataCallback<News> {
    private Myadapter md;
    private ArrayList<News.DataBean> mlist;
    private RecyclerView mrv;
    private OkhttpUtils mutils;
    private String url = "https://www.zhaoapi.cn/quarter/getJokes?page=1&token=22DEA5174137AE5352E8A7A606C8EA06&source=android&appVersion=101";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mrv = (RecyclerView) findViewById(R.id.rv);
        //开始进行网络请求
        initdata();
    }
    //网络请求
    private void initdata() {
        mutils = new OkhttpUtils();
        mutils.getdata(url, this, News.class);
    }
    @Override
    public void success(News news) {
        //得到集合类(这一步千万不能落下,否则得不到数据)
        mlist = (ArrayList<News.DataBean>) news.getData();
        //设置适配器
        md = new Myadapter(mlist, this);
        //LinearLayout管理器(线性布局管理器)
        //  1、mrv.setLayoutManager(new LinearLayoutManager(this));
        /*
        *  (1)Context
        *  (2)方向,上面的是水平方向,还可以选择垂直方向LinearLayoutManager.VERTICAL
        *  (3)是否颠倒循序,这个是针对数据源的,就是把你传进去的数据进行倒着显示,比如你穿进去的集合是{1,2,3,4},那么这个参数为false的时候,显示的是1,2,3,4,但是如果你选择的是true,显示的是4,3,2,1。
        * */
        //2、mrv.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));

        /*
         *  GridLayout管理器(网格布局管理器)
         * (1)Context  (2)显示多少列
        */
        // 1、 mrv.setLayoutManager(new GridLayoutManager(this,2));
        
        /*
        *   瀑布流布局管理器(StaggeredLayouManager):
        *  (1)Context  (2)显示列数
        * */
        mrv.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));
        //设置分割线
        mrv.addItemDecoration(new DividerItemDecoration(this, LinearLayoutManager.VERTICAL));
        //设置适配器
        mrv.setAdapter(md);
    }
    @Override
    public void fail(int code, String str) {}
}

                
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40089806/article/details/79960578

Fragment复用Demo

import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; imp...
  • wh_beijixiong
  • wh_beijixiong
  • 2016年12月19日 20:43
  • 329

GreenDao+ButterKnife+Retrofit+Fresco展示网络数据

activity_main xml version="1.0" encoding="utf-8"?> LinearLayout xmlns:android="http://schemas.andro...
  • Logitech12
  • Logitech12
  • 2017年12月03日 21:14
  • 73

二级列表展示网络数据

public class MainActivity extends Activity { private ExpandableListView ep; private HttpResponse ...
  • chengchengcc00
  • chengchengcc00
  • 2016年05月26日 21:01
  • 197

RecyclerView+OkHttp展示网络数据

做项目涉及到联网肯定是需要展示网络数据的,RecyclerView+Okhttp展示网络数据虽然很基础很简单,但想想还是写出来让初学者了解一下1、首先先导入需要用到的依赖包//recyclerview...
  • lanrenxiaowen
  • lanrenxiaowen
  • 2017年05月25日 16:06
  • 1674

XListView之网络数据展示

public class Zhou7 extends Fragment implements XListView.IXListViewListener { @Nullable priv...
  • Princess_Sx
  • Princess_Sx
  • 2017年05月25日 13:59
  • 1241

Android之ListView访问网络数据

ListView访问网络数据
  • ly_rose
  • ly_rose
  • 2015年12月15日 14:15
  • 1276

MVP+Retrofit+RecyclerView实现加载网络数据

依赖 compile 'com.android.support:design:26.1.0' compile 'com.android.support:recyclerview-v7:2...
  • weixin_40397238
  • weixin_40397238
  • 2017年12月02日 11:54
  • 156

MVP获取网络数据并展示

//MyXLVAdapter 适配器页面 import android.app.AlertDialog; import android.content.Context; import android...
  • qq_38127722
  • qq_38127722
  • 2017年11月21日 18:46
  • 52

listView展示取出的网络数据

package lidabenshi.bwie.com.day04_lihaishengthree.Adapter; import android.content.Context; import a...
  • Dealpoor
  • Dealpoor
  • 2017年09月03日 19:12
  • 100

解析网络json数据并展示到ListView上

网易新闻看起来很简洁,左边是一张图片,右边是一些文字信息,这样的排版是十分常见的,给人的感觉就是简洁明了,下面通过解析网络json数据并展示到ListView上,来实现同样的效果,效果图如下: ...
  • ljw124213
  • ljw124213
  • 2016年09月14日 21:46
  • 4157
收藏助手
不良信息举报
您举报文章:OkHttp+RecycleView展示网络数据
举报原因:
原因补充:

(最多只允许输入30个字)