activity_main
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.bwie.test.jinfengkai20180427.MainActivity"> <android.support.v7.widget.RecyclerView android:id="@+id/recyel_view" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v7.widget.RecyclerView> </RelativeLayout>
rv_pullimg_item
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/title_zhong" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <ImageView android:id="@+id/img1" android:layout_width="80dp" android:layout_height="80dp" android:layout_marginRight="10dp" /> <ImageView android:id="@+id/img2" android:layout_width="80dp" android:layout_height="80dp" android:layout_marginRight="10dp"/> <ImageView android:id="@+id/img3" android:layout_width="80dp" android:layout_height="80dp" android:layout_marginRight="10dp" /> </LinearLayout> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="2dp" android:text="1256评论 120个赞" android:layout_gravity="right" /> </LinearLayout>
rv_rightimg_item
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_toLeftOf="@id/img_right" android:orientation="vertical"> <TextView android:id="@+id/title_rightlayout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="title" android:textSize="16sp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:text="1256评论 120个赞" android:layout_gravity="right" /> </LinearLayout> <ImageView android:id="@+id/img_right" android:src="@mipmap/ic_launcher" android:layout_alignParentRight="true" android:layout_marginRight="5dp" android:layout_width="80dp" android:layout_height="80dp" /> </RelativeLayout>
MainActivity
import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import com.bwie.test.adapter.MyAdapter; import com.bwie.test.bean.Bean; import com.bwie.test.util.OkhttpUtils; import com.bwie.test.util.OnNetListener; import com.google.gson.Gson; import java.util.List; public class MainActivity extends AppCompatActivity { private RecyclerView mRv; public static String host = "http://365jia.cn/uploads/"; private String url = "http://365jia.cn/news/api3/365jia/news/headline?page=1"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //隐藏原有标题 //getSupportActionBar().hide(); initView(); OkhttpUtils.getInstance().doGet(url, new OnNetListener() { @Override public void onSuccess(String result) { Bean bean = new Gson().fromJson(result, Bean.class); List<Bean.DataBeanX.DataBean> data = bean.getData().getData(); MyAdapter myAdapter = new MyAdapter(MainActivity.this, data); mRv.setAdapter(myAdapter); } @Override public void onFailed(Exception e) { } }); } private void initView() { mRv = (RecyclerView) findViewById(R.id.recyel_view); mRv.setLayoutManager(new LinearLayoutManager(this)); } }
MyAdapter
import android.content.Context; import android.support.annotation.NonNull; 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 com.bwie.test.bean.Bean; import com.bwie.test.jinfengkai20180427.MainActivity; import java.util.List; import com.bwie.test.jinfengkai20180427.R; public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private Context context; private List<Bean.DataBeanX.DataBean> list; private LayoutInflater inflater; private static final int NORMAL = 0; private static final int IMAGES = 1; public MyAdapter(Context context, List<Bean.DataBeanX.DataBean> list) { this.context = context; this.list = list; inflater = LayoutInflater.from(context); } @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { RecyclerView.ViewHolder holder; if (viewType == NORMAL) { View view = inflater.inflate(R.layout.rv_rightimg_item, parent, false); holder = new NormalViewHolder(view); } else if (viewType == IMAGES) { View view = inflater.inflate(R.layout.rv_pullimg_item, parent, false); holder = new ImagesViewHolder(view); } else { holder = null; } return holder; } @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { Bean.DataBeanX.DataBean dataBean = list.get(position); if ("normal".equals(dataBean.getType())) { NormalViewHolder normalViewHolder = (NormalViewHolder) holder; normalViewHolder.title_rightlayout.setText(dataBean.getTitle()); String imgUrl = dataBean.getPics().get(0); String url = MainActivity.host + imgUrl; Glide.with(context).load(url).into(normalViewHolder.img_right); } else if ("images".equals(dataBean.getType())) { ImagesViewHolder imagesViewHolder = (ImagesViewHolder) holder; List<String> pics = dataBean.getPics(); String img1 = pics.get(0); String imgUrl1 = MainActivity.host + img1; String img2 = pics.get(1); String imgUrl2 = MainActivity.host + img2; String img3 = pics.get(2); String imgUrl3 = MainActivity.host + img3; Glide.with(context).load(imgUrl1).into(imagesViewHolder.img1); Glide.with(context).load(imgUrl2).into(imagesViewHolder.img2); Glide.with(context).load(imgUrl3).into(imagesViewHolder.img3); imagesViewHolder.title_zhong.setText(dataBean.getTitle()); } } @Override public int getItemCount() { return list.size(); } @Override public int getItemViewType(int position) { Bean.DataBeanX.DataBean dataBean = list.get(position); String type = dataBean.getType(); if ("normal".equals(type)) { return NORMAL; } else { return IMAGES; } } class NormalViewHolder extends RecyclerView.ViewHolder { private final TextView title_rightlayout; private final ImageView img_right; public NormalViewHolder(View itemView) { super(itemView); title_rightlayout = itemView.findViewById(R.id.title_rightlayout); img_right = itemView.findViewById(R.id.img_right); } } class ImagesViewHolder extends RecyclerView.ViewHolder { private final TextView title_zhong; private final ImageView img1; private final ImageView img2; private final ImageView img3; public ImagesViewHolder(View itemView) { super(itemView); title_zhong = itemView.findViewById(R.id.title_zhong); img1 = itemView.findViewById(R.id.img1); img2 = itemView.findViewById(R.id.img2); img3 = itemView.findViewById(R.id.img3); } } }
util文件夹下工具类
OnNetListener
package com.bwie.test.util; public interface OnNetListener { void onSuccess(String result); void onFailed(Exception e); }
MyInterceptor
import java.io.IOException; import okhttp3.FormBody; import okhttp3.HttpUrl; import okhttp3.Interceptor; import okhttp3.Request; import okhttp3.Response; public class MyInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { Response response; //区分是GET请求还是POST请求 Request originRequest = chain.request(); if ("GET".equals(originRequest.method())) { HttpUrl httpUrl = originRequest.url() .newBuilder() .addQueryParameter("source", "android") .build(); Request request = new Request.Builder().url(httpUrl).build(); //发送请求 response = chain.proceed(request); } else { FormBody.Builder builder = new FormBody.Builder(); FormBody body = (FormBody) originRequest.body(); int size = body.size(); for (int i = 0; i < size; i++) { builder.add(body.name(i), body.value(i)); } builder.add("source", "android"); FormBody formBody = builder.build(); Request request = new Request.Builder() .url(originRequest.url()) .post(formBody) .build(); response = chain.proceed(request); } return response; } }
OkhttpUtils
import android.os.Handler; import android.os.Looper; import java.io.IOException; import java.util.Map; import java.util.concurrent.TimeUnit; import okhttp3.Call; import okhttp3.Callback; import okhttp3.FormBody; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; import okhttp3.logging.HttpLoggingInterceptor; public class OkhttpUtils { private static OkhttpUtils instance; private final OkHttpClient okHttpClient; private final Handler handler; private OkhttpUtils() { HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); logging.setLevel(HttpLoggingInterceptor.Level.BODY); okHttpClient = new OkHttpClient.Builder() .connectTimeout(15, TimeUnit.SECONDS)//连接超时 .writeTimeout(20, TimeUnit.SECONDS)//写入超时 .readTimeout(20, TimeUnit.SECONDS)//读取超时 //.addInterceptor(new MyInterceptor()) .addInterceptor(logging) .build(); handler = new Handler(Looper.getMainLooper()); } public static OkhttpUtils getInstance() { if (instance == null) { instance = new OkhttpUtils(); } return instance; } /** * GET请求 * @param url */ public void doGet(String url, final OnNetListener onNetListener) { //创建Request final Request request = new Request.Builder() .url(url) .build(); //发送请求 okHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, final IOException e) { handler.post(new Runnable() { @Override public void run() { onNetListener.onFailed(e); } }); } @Override public void onResponse(Call call, Response response) throws IOException { //拿到服务器返回的数据 final String string = response.body().string(); handler.post(new Runnable() { @Override public void run() { onNetListener.onSuccess(string); } }); } }); } /** * POST请求 * @param url * @param params * @param onNetListener */ public void doPost(String url, Map<String, String> params, final OnNetListener onNetListener) { FormBody.Builder builder = new FormBody.Builder(); for (Map.Entry<String, String> entry : params.entrySet()) { builder.add(entry.getKey(), entry.getValue()); } //创建FormBody FormBody formBody = builder.build(); //创建Request Request request = new Request.Builder() .url(url) .post(formBody) .build(); //请求数据 okHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, final IOException e) { handler.post(new Runnable() { @Override public void run() { onNetListener.onFailed(e); } }); } @Override public void onResponse(Call call, Response response) throws IOException { //拿到服务器返回的数据 final String string = response.body().string(); handler.post(new Runnable() { @Override public void run() { onNetListener.onSuccess(string); } }); } }); } }
使用的依赖和方法
//recyclerview依赖注入 compile 'com.android.support:recyclerview-v7:26.0.0-alpha1' //gson依赖注入 compile 'com.google.code.gson:gson:2.8.2' //github依赖注入 compile 'com.github.bumptech.glide:glide:3.6.0' //okhttp3依赖注入 compile 'com.squareup.okhttp3:okhttp:3.9.1' compile 'com.squareup.okio:okio:1.13.0' //image-loader依赖注入 implementation 'com.squareup.okhttp3:logging-interceptor:3.6.0'
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/> <uses-permission android:name="android.permission.CAMERA"/>
bean文件夹下Bean
public class Bean { private int httpStatusCode; private int code; private DataBeanX data; public int getHttpStatusCode() { return httpStatusCode; } public void setHttpStatusCode(int httpStatusCode) { this.httpStatusCode = httpStatusCode; } public int getCode() { return code; } public void setCode(int code) { this.code = code; } public DataBeanX getData() { return data; } public void setData(DataBeanX data) { this.data = data; } public static class DataBeanX { private int page; private int perpage; private int max_page; private int total; private ExtrasBean extras; private String bindtips; private List<DataBean> data; public int getPage() { return page; } public void setPage(int page) { this.page = page; } public int getPerpage() { return perpage; } public void setPerpage(int perpage) { this.perpage = perpage; } public int getMax_page() { return max_page; } public void setMax_page(int max_page) { this.max_page = max_page; } public int getTotal() { return total; } public void setTotal(int total) { this.total = total; } public ExtrasBean getExtras() { return extras; } public void setExtras(ExtrasBean extras) { this.extras = extras; } public String getBindtips() { return bindtips; } public void setBindtips(String bindtips) { this.bindtips = bindtips; } public List<DataBean> getData() { return data; } public void setData(List<DataBean> data) { this.data = data; } public static class ExtrasBean { private List<SliderBean> slider; public List<SliderBean> getSlider() { return slider; } public void setSlider(List<SliderBean> slider) { this.slider = slider; } public static class SliderBean { private int id; private String pic; private String link; private String t; private int inner_news; private String title; private String type; private String type_sign; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getPic() { return pic; } public void setPic(String pic) { this.pic = pic; } public String getLink() { return link; } public void setLink(String link) { this.link = link; } public String getT() { return t; } public void setT(String t) { this.t = t; } public int getInner_news() { return inner_news; } public void setInner_news(int inner_news) { this.inner_news = inner_news; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getType() { return type; } public void setType(String type) { this.type = type; } public String getType_sign() { return type_sign; } public void setType_sign(String type_sign) { this.type_sign = type_sign; } } } public static class DataBean { private int id; private String title; private String link; private String t; private String type; private String alias; private int pic_amount; private String style; private int comment_amount; private String source; private String type_sign; private int inner_news; private int views; private String comment_amount_label; private String views_label; private List<String> pics; private List<String> pics_new; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getLink() { return link; } public void setLink(String link) { this.link = link; } public String getT() { return t; } public void setT(String t) { this.t = t; } public String getType() { return type; } public void setType(String type) { this.type = type; } public String getAlias() { return alias; } public void setAlias(String alias) { this.alias = alias; } public int getPic_amount() { return pic_amount; } public void setPic_amount(int pic_amount) { this.pic_amount = pic_amount; } public String getStyle() { return style; } public void setStyle(String style) { this.style = style; } public int getComment_amount() { return comment_amount; } public void setComment_amount(int comment_amount) { this.comment_amount = comment_amount; } public String getSource() { return source; } public void setSource(String source) { this.source = source; } public String getType_sign() { return type_sign; } public void setType_sign(String type_sign) { this.type_sign = type_sign; } public int getInner_news() { return inner_news; } public void setInner_news(int inner_news) { this.inner_news = inner_news; } public int getViews() { return views; } public void setViews(int views) { this.views = views; } public String getComment_amount_label() { return comment_amount_label; } public void setComment_amount_label(String comment_amount_label) { this.comment_amount_label = comment_amount_label; } public String getViews_label() { return views_label; } public void setViews_label(String views_label) { this.views_label = views_label; } public List<String> getPics() { return pics; } public void setPics(List<String> pics) { this.pics = pics; } public List<String> getPics_new() { return pics_new; } public void setPics_new(List<String> pics_new) { this.pics_new = pics_new; } } } }