前两篇文章分别讲了OkHttp网络请求数据和RecyclerView布局,接下来两个一起使用,代码量是很大的,这里我只展示一部分代码,基本的代码可以在前两篇的文章中找见。
这是效果图,先展示一下,网络接口选择的有点问题,但效果试出来了,大家可以自己换一下网络接口。
代码:MainActivity:这其中最重要的就是内部类适配器了,
- <span style="font-size:18px;" deep="5">package com.eightgroup.recyclerviewtext;
- import android.content.Context;
- import android.support.v7.app.AppCompatActivity;
- import android.os.Bundle;
- import android.support.v7.widget.GridLayoutManager;
- import android.support.v7.widget.LinearLayoutManager;
- import android.support.v7.widget.RecyclerView;
- import android.support.v7.widget.StaggeredGridLayoutManager;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.ImageView;
- import android.widget.TextView;
- import android.widget.Toast;
- import com.nostra13.universalimageloader.core.ImageLoader;
- import java.io.IOException;
- import java.util.ArrayList;
- import java.util.List;
- import bean.MyNews;
- import bean.users;
- import okhttp3.Call;
- import utils.GsonObjectCallback;
- import utils.NetWorkUtils;
- import utils.OkHttp3Utils;
- public class MainActivity extends AppCompatActivity {
- private RecyclerView mRecyclerView;
- private ArrayList<MyNews> mDatas;
- String URLPATH = "http://api.tianapi.com/social/?key=71e58b5b2f930eaf1f937407acde08fe&num=20";
- TextView id_num;
- ImageView img;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- id_num = (TextView) findViewById(R.id.id_num);
- img = (ImageView) findViewById(R.id.img);
- mDatas = new ArrayList<MyNews>();
- // 判断网络
- boolean netWorkAvailable = NetWorkUtils.isNetWorkAvailable(this);
- if (!netWorkAvailable) {
- Toast.makeText(MainActivity.this, "联网:" + netWorkAvailable, Toast.LENGTH_SHORT).show();
- }
- // get请求数据
- getData();
- mRecyclerView = (RecyclerView) findViewById(R.id.id_recyclerview);
- //线性布局管理器,支持水平和垂直效果
- // mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
- // 网格布局管理器,支持水平和垂直效果
- // mRecyclerView.setLayoutManager(new GridLayoutManager(this,4));
- // 分布型管理器,瀑布流效果
- mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL));
- // 添加分割线
- mRecyclerView.addItemDecoration(new DividerItemDecoration(this,
- DividerItemDecoration.VERTICAL_LIST));
- }
- private void getData() {
- OkHttp3Utils.getInstance().doGet(URLPATH, new GsonObjectCallback<users>() {
- @Override
- public void onUi(users users) {
- List<bean.users.NewslistBean> newslist = users.getNewslist();
- for (bean.users.NewslistBean un:newslist) {
- mDatas.add(new MyNews(un.getPicUrl(),un.getTitle()));
- }
- mRecyclerView.setAdapter(new HomeAdapter(MainActivity.this));
- }
- @Override
- public void onFailed(Call call, IOException e) {
- }
- });
- }
- class HomeAdapter extends RecyclerView.Adapter<HomeAdapter.MyViewHolder> {
- Context context;
- public HomeAdapter(Context context) {
- this.context = context;
- }
- @Override
- public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
- MyViewHolder holder = new MyViewHolder(LayoutInflater.from(
- MainActivity.this).inflate(R.layout.item_home, parent,
- false));
- return holder;
- }
- @Override
- public void onBindViewHolder(MyViewHolder holder, int position) {
- holder.tv.setText(mDatas.get(position).getTitle());
- String imgURL = mDatas.get(position).getPic();
- if (imgURL.equals("") || imgURL == null){
- holder.img.setImageResource(R.mipmap.ic_launcher);
- }else {
- ImageLoader loader = ImageLoader.getInstance();
- loader.displayImage(imgURL,holder.img);
- }
- }
- @Override
- public int getItemCount() {
- return mDatas.size();
- }
- class MyViewHolder extends RecyclerView.ViewHolder {
- TextView tv;
- ImageView img;
- public MyViewHolder(View view) {
- super(view);
- tv = (TextView) view.findViewById(R.id.id_num);
- img = (ImageView) view.findViewById(R.id.img);
- }
- }
- }
- }
- </span>
- <span style="font-size:18px;">Json数据封装了一个Users类,我把我要显示的数据单独封装了一个类MyNews,重点还是内部的适配器,添加数据这一块</span>
- <span style="font-size:18px;">
- </span>
其中要使用分割线,自己封装一个类:DividerItemDecoration:
- package com.eightgroup.recyclerviewtext;
- import android.content.Context;
- import android.content.res.TypedArray;
- import android.graphics.Canvas;
- import android.graphics.Rect;
- import android.graphics.drawable.Drawable;
- import android.support.v7.widget.LinearLayoutManager;
- import android.support.v7.widget.RecyclerView;
- import android.util.Log;
- import android.view.View;
- /**
- * Created by 笔片 on 2017/10/12.
- */
- public class DividerItemDecoration extends RecyclerView.ItemDecoration {
- private static final int[] ATTRS = new int[]{
- android.R.attr.listDivider
- };
- public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;
- public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;
- private Drawable mDivider;
- private int mOrientation;
- public DividerItemDecoration(Context context, int orientation) {
- final TypedArray a = context.obtainStyledAttributes(ATTRS);
- mDivider = a.getDrawable(0);
- a.recycle();
- setOrientation(orientation);
- }
- public void setOrientation(int orientation) {
- if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) {
- throw new IllegalArgumentException("invalid orientation");
- }
- mOrientation = orientation;
- }
- @Override
- public void onDraw(Canvas c, RecyclerView parent) {
- if (mOrientation == VERTICAL_LIST) {
- drawVertical(c, parent);
- } else {
- drawHorizontal(c, parent);
- }
- }
- public void drawVertical(Canvas c, RecyclerView parent) {
- final int left = parent.getPaddingLeft();
- final int right = parent.getWidth() - parent.getPaddingRight();
- final int childCount = parent.getChildCount();
- for (int i = 0; i < childCount; i++) {
- final View child = parent.getChildAt(i);
- android.support.v7.widget.RecyclerView v = new android.support.v7.widget.RecyclerView(parent.getContext());
- final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
- .getLayoutParams();
- final int top = child.getBottom() + params.bottomMargin;
- final int bottom = top + mDivider.getIntrinsicHeight();
- mDivider.setBounds(left, top, right, bottom);
- mDivider.draw(c);
- }
- }
- public void drawHorizontal(Canvas c, RecyclerView parent) {
- final int top = parent.getPaddingTop();
- final int bottom = parent.getHeight() - parent.getPaddingBottom();
- final int childCount = parent.getChildCount();
- for (int i = 0; i < childCount; i++) {
- final View child = parent.getChildAt(i);
- final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
- .getLayoutParams();
- final int left = child.getRight() + params.rightMargin;
- final int right = left + mDivider.getIntrinsicHeight();
- mDivider.setBounds(left, top, right, bottom);
- mDivider.draw(c);
- }
- }
- @Override
- public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) {
- if (mOrientation == VERTICAL_LIST) {
- outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
- } else {
- outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
- }
- }
- }
- 到这,代码基本上的完成了,剩下的基本的代码可以到以前的内容中找。