XRecyclerView的下拉刷新上拉加载功能
来源:互联网 发布:网络继续教育学院 编辑:程序博客网 时间:2024/05/22 06:35
以前一直是用的XListView 可是 测试发现有一个奇奇怪怪的BUG,我们还无法解决。最严重的是 XListView 里面用的添加头addHeaderView方法在17以前有概率崩溃。后来在同事的项目里看到PullToZoomListViewEx开源代码,实现的很好,但是代码太难懂,感觉扩展性不好。
最后在RecyclerView的强大功能下,还是觉得要用集成RecyclerView的下拉刷新上拉加载的控件才好。
好用集成RecyclerView下拉功能的控件都用到了SwipeRefreshLayout布局,使得下拉样式很官方,不满足产品大大的需求。(其实官方多好的)
后来找到了这款开源的控件XRecyclerView git地址:https://github.com/jianghejie/XRecyclerView 可以看动画效果
掩饰不住内心高兴的心情,下载下来,发现功能太强的了
但是也有很多不足的地方,不必 很多 选择刷新和加载的样式类。其实一般不需要
主要原理就是把重写的Adapter 把我们的mHeader和mFooter (如果需要还有 headviews)重组到Adapter 里面。并且也重写了监听。
这个设计简直就是棒棒哒
import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v4.app.Fragment;import android.support.v7.widget.LinearLayoutManager;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import com.bwie.test.yuekaomoni.utils.GsonObjectCallback;import com.bwie.test.yuekaomoni.utils.OkHttp3Utils;import com.jcodecraeer.xrecyclerview.XRecyclerView;import java.io.IOException;import java.util.ArrayList;import java.util.List;import okhttp3.Call;public class Fragment1 extends Fragment{ XRecyclerView recyclerView; int pager=21; private String path; List<Beans.SongListBean> beas; HomeAdapter homeAdapter; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view=inflater.inflate(R.layout.fragment_1,null); recyclerView=view.findViewById(R.id.recycler); beas=new ArrayList<>(); LinearLayoutManager layoutManager=new LinearLayoutManager(getActivity()); layoutManager.setOrientation(LinearLayoutManager.VERTICAL); recyclerView.setLayoutManager(layoutManager); recyclerView.setLoadingListener(new XRecyclerView.LoadingListener() { @Override public void onRefresh() { pager=21; getDate(pager,""); } @Override public void onLoadMore() { pager=pager+1; getDate(pager,"load"); } }); getDate(pager,""); return view; } private void getDate(int pager, final String type) { path = "http://tingapi.ting.baidu.com/v1/restserver/ting?method=baidu.ting.billboard.billList&type=2&size="+pager+"&offset=0"; OkHttp3Utils.getInstance().doGet(path,new GsonObjectCallback<Beans>() { @Override public void onUi(Beans beans) { List<Beans.SongListBean> song_list = beans.getSong_list(); if (type.equals("load")){ beas.addAll(song_list); homeAdapter.notifyDataSetChanged(); recyclerView.loadMoreComplete(); }else{ if (homeAdapter==null){ beas=song_list; homeAdapter = new HomeAdapter(beas, getActivity()); recyclerView.setAdapter(homeAdapter); } homeAdapter.notifyDataSetChanged(); recyclerView.refreshComplete(); } } @Override public void onFailed(Call call, IOException e) { } }); }}
这里了是添加数据的适配器。。。
import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.AsyncTask;import android.support.v7.widget.RecyclerView;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import com.nostra13.universalimageloader.core.ImageLoader;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;import java.util.ArrayList;import java.util.List;public class HomeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{ public final int ONE=1; public final int TWO=2; List<Beans.SongListBean> songs; Context context; ArrayList mlist; public HomeAdapter(List<Beans.SongListBean> songs,Context context) { this.context = context; this.songs = songs; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View mview = null; if (viewType == ONE) { mview = LayoutInflater.from(context).inflate(R.layout.fragment_item, null); ViewHolderA holder = new ViewHolderA(mview); return holder; }else { mview = LayoutInflater.from(context).inflate(R.layout.fragment_er, null); ViewHolderB holder = new ViewHolderB(mview); return holder; } } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if(holder instanceof ViewHolderA){ mlist=new ArrayList(); for(int i=0;i<songs.size();i++){ mlist.add(songs.get(i).getPic_big()); } //设置图片加载器 ((ViewHolderA) holder).banner.setImageLoader(new geLoader()); ((ViewHolderA) holder).banner.setImages(mlist); ((ViewHolderA) holder).banner.start(); }else { ((ViewHolderB) holder).texts.setText(songs.get(position).getSi_proxycompany()); /*Glide.with(context).load(songs.get(position).getPic_small()).into(((ViewHolderB) holder).img);*/ ImageLoader.getInstance().displayImage(songs.get(position).getPic_small(),((ViewHolderB) holder).img); /* loadImage(((ViewHolderB) holder).img,songs.get(position).getPic_small(),10,10);*/ } } @Override public int getItemCount() { return songs.size(); } @Override public int getItemViewType(int position) { if(position==0){ return ONE; }else { return TWO; } } /* img即你要获得图片的控件 path即你要从网络上获取的图片 destHight你要采样的图片高度 deWeight你要采样的图片宽度 */ private void loadImage(final ImageView img, String path, final int destHight, final int destWeight) { new AsyncTask<String, Void, Bitmap>() { @Override protected void onPostExecute(Bitmap bitmap) { super.onPostExecute(bitmap); if (bitmap != null) img.setImageBitmap(bitmap); else img.setImageResource(R.mipmap.ic_launcher); } @Override protected Bitmap doInBackground(String... params) { try { String path = params[0]; URL url = new URL(path); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setConnectTimeout(5000); connection.setReadTimeout(5000); int code = connection.getResponseCode(); if (code == 200) { //得到图片数据 InputStream is = connection.getInputStream(); //BitmapFactory.decodeStream(is);//ARGB_888 一个像素占 4个字节 ARGB_565 一个像素占 2 个字节 Alpha Red、Green、Blue(颜色) BitmapFactory.Options options = new BitmapFactory.Options(); //在图片真正解析之前,不要解析图片数据,只需要告诉一下转换器,只要获取图片的像素(宽高) options.inJustDecodeBounds = true;//告诉BitmapFactory转换工厂不去真正解析图片只需要拿到图片宽高就行 //假解析 API 有bug BitmapFactory.decodeStream(is, null, options); //压缩,根据图片采样率进行二次采样 100 * 100 是你所期望的具体图片尺寸 //options.inSampleSize = 2; //采样用来计算图片的宽高(1920 * 1080 -> 1920 / 2 1080 / 2) //获取图片宽高,注意:图片的原始宽高 int width = options.outWidth; int height = options.outHeight; System.out.println("宽:" + width + "高 : " + height); //定义一个变量去记住我们采样率 int inSampleSize = 1;//默认是1 ,即不对图片进行任何压缩 if (width > destWeight || height > destHight) { int halfWidth = width / 2; int halfHeight = height / 2; while ((halfWidth / inSampleSize) >= destWeight && (halfHeight / inSampleSize) >= destHight) { //计算采样率 inSampleSize *= 2; } } //采样率改变了 options.inSampleSize = inSampleSize;// 8 //图片压缩完之后,放行图片解析 options.inJustDecodeBounds = false;//告诉图片转换工厂,可以解析图片了 //关闭之前的流 is.close(); //重新再去得到当前这张图片的字节流数据 is = url.openStream(); //开始解析图片 Bitmap bitmap = BitmapFactory.decodeStream(is, null, options); //关闭流 is.close(); // Bitmap bitmap = BitmapFactory.decodeStream(is); return bitmap; } } catch (Exception e) { e.printStackTrace(); } return null; } }.execute(path); }}
阅读全文
1 0
- XRecyclerView的下拉刷新上拉加载功能
- XRecyclerView的上拉加载,下拉刷新
- XRecyclerView下拉刷新和上拉加载
- XRecyclerView上拉刷新下拉加载
- XRecyclerView 上拉刷新、下拉加载
- XRecyclerView 上拉加载 下拉刷新
- XRecyclerView下拉刷新,上拉加载
- 使用XRecyclerview下拉刷新,上拉加载
- 支持下拉刷新上拉加载xrecyclerview的基本使用
- Xrecyclerview的使用(上拉刷新,下拉加载)
- XRecyclerView的下拉刷新和上拉加载
- RecyclerView的上拉加载下拉刷新-xRecyclerView
- XRecyclerView+上拉加载下拉刷新+多条目加载
- XRecyclerView 实现下拉刷新和上拉加载更多
- xRecyclerView简单实现下拉刷新和上拉加载
- xRecyclerView简单实现下拉刷新和上拉加载
- Android XRecyclerView简单实现上拉刷新,下拉加载
- Mvp+OkHttp+XRecyclerView------上拉加载下拉刷新
- jq 移除属性 removeAttr();
- spring生命周期
- Java容器有哪些?
- PullToRefreshGridView
- Android JNI编程
- XRecyclerView的下拉刷新上拉加载功能
- angular实现投票
- RGB颜色查询对照表
- IE兼容问题解决
- noip题目复习
- 操作系统面试题汇总(持续更新)
- 购物车
- 机器学习入门笔记(十一)----推荐系统
- 北京师范大学第十四届ACM决赛- F Training Plan