依赖,权限
由于XRecycleView是v7的所以在使用该方法的时候我们必须导入依赖
compile 'com.jcodecraeer:xrecyclerview:1.3.2'
当然如果你需求里没有刷新的话,我们可以导入
compile 'com.android.support:recyclerview-v7:26.0.0-alpha1'
网络请求OkHttp
compile 'com.squareup.okhttp3:okhttp:3.8.1'
因为是网络请求还得导入Gson解析的依赖
compile 'com.google.code.gson:gson:2.8.1'
glide的权限
compile 'com.github.bumptech.glide:glide:4.0.0'
在清单文件配置网络请求的权限
<uses-permission android:name="android.permission.INTERNET"></uses-permission> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
布局
activity_main.xml里面
<?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.example.administrator.pangxiaoxu20170814.MainActivity"> <com.jcodecraeer.xrecyclerview.XRecyclerView android:id="@+id/recycler" android:layout_width="match_parent" android:layout_height="match_parent"/> </RelativeLayout>
item布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/image" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
和listview一样的一个简单的布局
下面是代码
OkHttp网络请求
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 request = new Request.Builder().url(url).build(); //通过request的对象去构造得到一个Call对象 Call call = okhttp.newCall(request); //调用的是call.enqueue,将call加入调度队列,然后等待任务执行完成,我们在Callback中即可得到结果。 call.enqueue(new Callback() { //失败的情况 @Override public void onFailure(Call call, IOException e) { Log.e("///", "onFailure"); 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); } }); } }); } //post请求 public <T> void getLoadDataPost(String url, final NetDataCallback netDataCallback, final Class<T> tClass, RequestBody body) { this.netDataCallback = netDataCallback; OkHttpClient okHttpClient = new OkHttpClient.Builder() .readTimeout(20, TimeUnit.SECONDS) .connectTimeout(10, TimeUnit.SECONDS) .build(); final Request request = new Request.Builder().url(url).post(body).build(); Call call = okHttpClient.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 { T t = new 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); } }); } }); } }
定义了一个接口类
public interface NetDataCallback<T> { void success(T t); void fail(int code, String str); }
下面是一个动画类
public class SpacesItemDecoration extends XRecyclerView.ItemDecoration { private int space; public SpacesItemDecoration(int space) { this.space = space; } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { outRect.left = space; outRect.right = space; outRect.bottom = space; if (parent.getChildAdapterPosition(view) == 0) { outRect.top = space; } } }
这是封装的Bean类
public class Bean { private List<美女Bean> 美女; public List<美女Bean> get美女() { return 美女; } public void set美女(List<美女Bean> 美女) { this.美女 = 美女; } public static class 美女Bean { /** * adtype : 0 * boardid : comment_bbs * clkNum : 0 * danmu : 1 * digest : 摘自微博 不知道是哪位美女 * docid : CQ91TK0R9001TK0S * downTimes : 85 * img : http://dmr.nosdn.127.net/NWzVIyhX2e64vzeGubrARA==/6896093023037637938.jpg * imgType : 0 * imgsrc : http://dmr.nosdn.127.net/NWzVIyhX2e64vzeGubrARA==/6896093023037637938.jpg * imgsum : 0 * picCount : 0 * pixel : 700*873 * program : HY * prompt : 成功为您推荐20条新内容 * rank : 0 * recNews : 0 * recType : 0 * refreshPrompt : 0 * replyCount : 8 * replyid : CQ91TK0R9001TK0S * source : 堆糖网 * title : 摘自微博 不知道是哪位美女 * upTimes : 269 */ private int adtype; private String boardid; private int clkNum; private int danmu; private String digest; private String docid; private int downTimes; private String img; private int imgType; private String imgsrc; private int imgsum; private int picCount; private String pixel; private String program; private String prompt; private int rank; private int recNews; private int recType; private int refreshPrompt; private int replyCount; private String replyid; private String source; private String title; private int upTimes; public int getAdtype() { return adtype; } public void setAdtype(int adtype) { this.adtype = adtype; } public String getBoardid() { return boardid; } public void setBoardid(String boardid) { this.boardid = boardid; } public int getClkNum() { return clkNum; } public void setClkNum(int clkNum) { this.clkNum = clkNum; } public int getDanmu() { return danmu; } public void setDanmu(int danmu) { this.danmu = danmu; } public String getDigest() { return digest; } public void setDigest(String digest) { this.digest = digest; } public String getDocid() { return docid; } public void setDocid(String docid) { this.docid = docid; } public int getDownTimes() { return downTimes; } public void setDownTimes(int downTimes) { this.downTimes = downTimes; } public String getImg() { return img; } public void setImg(String img) { this.img = img; } public int getImgType() { return imgType; } public void setImgType(int imgType) { this.imgType = imgType; } public String getImgsrc() { return imgsrc; } public void setImgsrc(String imgsrc) { this.imgsrc = imgsrc; } public int getImgsum() { return imgsum; } public void setImgsum(int imgsum) { this.imgsum = imgsum; } public int getPicCount() { return picCount; } public void setPicCount(int picCount) { this.picCount = picCount; } public String getPixel() { return pixel; } public void setPixel(String pixel) { this.pixel = pixel; } public String getProgram() { return program; } public void setProgram(String program) { this.program = program; } public String getPrompt() { return prompt; } public void setPrompt(String prompt) { this.prompt = prompt; } public int getRank() { return rank; } public void setRank(int rank) { this.rank = rank; } public int getRecNews() { return recNews; } public void setRecNews(int recNews) { this.recNews = recNews; } public int getRecType() { return recType; } public void setRecType(int recType) { this.recType = recType; } public int getRefreshPrompt() { return refreshPrompt; } public void setRefreshPrompt(int refreshPrompt) { this.refreshPrompt = refreshPrompt; } public int getReplyCount() { return replyCount; } public void setReplyCount(int replyCount) { this.replyCount = replyCount; } public String getReplyid() { return replyid; } public void setReplyid(String replyid) { this.replyid = replyid; } public String getSource() { return source; } public void setSource(String source) { this.source = source; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public int getUpTimes() { return upTimes; } public void setUpTimes(int upTimes) { this.upTimes = upTimes; } }
下面是MainActivity
public class MainActivity extends AppCompatActivity implements NetDataCallback<Bean> { private XRecyclerView mrv; private RecyclerActivity md; private ArrayList<Bean.美女Bean> mlist = new ArrayList<>(); private OkHttpUtils http; 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); if (isNetworkAvailable(this)) { //有网的情况 Toast.makeText(MainActivity.this, "网络加载中....", Toast.LENGTH_SHORT).show(); mrv = (XRecyclerView) findViewById(R.id.recycler); //设置间隔 SpacesItemDecoration decoration = new SpacesItemDecoration(16); mrv.addItemDecoration(decoration); //加载网络数据 loaddata(); md = new RecyclerActivity(this, mlist); mrv.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL)); mrv.setAdapter(md); //属性动画渐变 ObjectAnimator animation = ObjectAnimator.ofFloat(mrv, "rotation", 0, 360); animation.setDuration(5000); animation.start(); //item条目的点击事件 md.setOnItemClickListener(new RecyclerActivity.OnItemClickListener() { @Override public void onItemClick(View view, int postion) { Toast.makeText(MainActivity.this, mlist.get(postion - 1).getDigest(), Toast.LENGTH_SHORT).show(); } }); //加载更多的点击事件 mrv.setLoadingListener(new XRecyclerView.LoadingListener() { @Override public void onRefresh() { //刷新的方法 mlist.clear(); loaddata(); mrv.refreshComplete(); } @Override public void onLoadMore() { //加载更多的方法 loaddata(); mrv.loadMoreComplete(); } }); } else { //没网的情况,提示去手动开启网络 Toast.makeText(MainActivity.this, "网络不可用", Toast.LENGTH_SHORT).show(); AlertDialog.Builder builder = new AlertDialog.Builder(this) .setTitle("提示") .setMessage("当前网络不可用,是否去设置网络") .setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Intent intent = new Intent("android.settings.WIFI_SETTINGS"); startActivity(intent); } }) .setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); finish(); } }); builder.create().show(); } } private void loaddata() { http = new OkHttpUtils(); http.getdata(url, (NetDataCallback) this, Bean.class); } //请求成功的方法 @Override public void success(Bean news) { Log.e("News的数据", news.toString()); mlist = (ArrayList<Bean.美女Bean>) news.get美女(); md.setdata(mlist); md.notifyDataSetChanged(); } @Override public void fail(int code, String str) { } //判断有无网络的方法 public static boolean isNetworkAvailable(Context context) { ConnectivityManager connectivity = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); if (connectivity != null) { NetworkInfo info = connectivity.getActiveNetworkInfo(); if (info != null && info.isConnected()) { // 当前网络是连接的 if (info.getState() == NetworkInfo.State.CONNECTED) { // 当前所连接的网络可用 return true; } } } return false; } }
最后是RexyxleView的适配器
public class RecyclerActivity extends RecyclerView.Adapter { ; private View view; private Context mcontext; private ArrayList<Bean.美女Bean> mlist = new ArrayList<>(); private OnItemClickListener mClickListener; public RecyclerActivity(Context mcontext, ArrayList<Bean.美女Bean> list) { this.mcontext = mcontext; this.mlist = list; } //找到需要导入的布局 @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { view = LayoutInflater.from(mcontext).inflate(R.layout.item, null); return new ViewHolder(view, mClickListener); } //加载相应的内容 @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { ViewHolder viewholder = (ViewHolder) holder; Glide.with(mcontext).load(getItem(position).getImgsrc()).into(viewholder.ima); } //手写的重置数据的方法 public void setdata(ArrayList<Bean.美女Bean> list) { if (list != null && list.size() > 0) { mlist.addAll(list); } } //手写的获得视图的方法 public Bean.美女Bean getItem(int position) { return mlist.get(position); } @Override public int getItemCount() { return mlist.size(); } //定义的ViewHolder类继承RecyclerView.ViewHolder 并找到布局中的ID public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { private OnItemClickListener mListener;// 声明自定义的接口 private ImageView ima; public ViewHolder(View itemView, OnItemClickListener listener) { super(itemView); mListener = listener; //给item设置点击事件 itemView.setOnClickListener(this); ima = (ImageView) itemView.findViewById(R.id.image); } @Override public void onClick(View v) { // getpostion()为Viewholder自带的一个方法,用来获取RecyclerView当前的位置,将此作为参数,传出去 mListener.onItemClick(v, getPosition()); } } //手写的一个接口 public interface OnItemClickListener { public void onItemClick(View view, int postion); } //自定义的方法 public void setOnItemClickListener(OnItemClickListener listener) { this.mClickListener = listener; } }