XRecyclerView的使用
来源:互联网 发布:田岛绣花软件 编辑:程序博客网 时间:2024/06/08 18:59
之前开发,一直使用ListView,后来使用RecyclerView,再后来下拉刷新的框架有SwipeRefreshLayout,把他和RecyclerView一起使用,感觉一直不错,但是,逻辑和代码还是比较麻烦,所以,现在开始用XRecyclerView,发现它真的是一个非常好用的框架.
首先要导入XRecyclerView,可以添加依赖,也可以直接导包,我这里有现成的包,想要的可以留言.
然后开始代码:
非常简单,包括加载轮播图,(轮播图用的也是插件 )我都有写注释
这里还包括了富文本,加载图片,以及网络请求的使用,还是比较全面的,但是界面比较简洁.
public class SubNewFragment extends android.support.v4.app.Fragment { private static final String TAG = SubNewFragment.class.getSimpleName(); private XRecyclerView mRecyclerView; private SubNewFragmentAdapter subNewFragmentAdapter; private boolean isPullRefresh; private RollPagerView mRollViewPager; private int REQUESTCODE = 0x11; private String nextPageToken= ""; private int catalog = 1; private TestNormalAdapter testNormalAdapter; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.layout_sub_new_fragment, container, false); sendRequest(); return view; } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); mRecyclerView = (XRecyclerView) view.findViewById(R.id.xrecyclerview); mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); //设置分割线(分割线的文件用的是万能分割线) mRecyclerView.addItemDecoration(new RecycleViewDivider(getContext(), LinearLayoutManager.HORIZONTAL)); //设置recyclerview下拉刷新进度条的样式 mRecyclerView.setRefreshProgressStyle(ProgressStyle.LineScalePulseOut); //设置recyclerview上拉加载更多的样式 mRecyclerView.setLoadingMoreProgressStyle(ProgressStyle.LineScalePulseOutRapid); //添加头部 View header = LayoutInflater.from(getContext()).inflate(R.layout.header, null, false); //轮播图的插件 mRollViewPager = (RollPagerView) header.findViewById(R.id.roll_view_pager); //设置播放时间间隔 mRollViewPager.setPlayDelay(3000); //设置透明度 mRollViewPager.setAnimationDurtion(500); //设置适配器 testNormalAdapter = new TestNormalAdapter(mRollViewPager); mRollViewPager.setAdapter(testNormalAdapter); //设置指示器(顺序依次) //自定义指示器图片 //设置圆点指示器颜色 //设置文字指示器 //隐藏指示器 //mRollViewPager.setHintView(new IconHintView(this, R.drawable.point_focus, R.drawable.point_normal)); mRollViewPager.setHintView(new ColorPointHintView(getContext(), Color.YELLOW, Color.WHITE)); //mRollViewPager.setHintView(new TextHintView(this)); //mRollViewPager.setHintView(null); //支持下拉刷新 mRecyclerView.setPullRefreshEnabled(true); //支持加载更多 mRecyclerView.setLoadingMoreEnabled(true); //设置recyclerview下拉刷新和加载更多的监听 mRecyclerView.setLoadingListener(new XRecyclerView.LoadingListener() { @Override public void onRefresh() {//下拉刷新 isPullRefresh = true; sendRequest(); } @Override public void onLoadMore() {//上拉加载更多 sendRequest(); } }); mRecyclerView.addHeaderView(header); //设置初始化状态为刷新状态。作用: 界面初始加载时,刷新数据。 mRecyclerView.refresh(); //设置适配器 subNewFragmentAdapter= new SubNewFragmentAdapter(getActivity()); mRecyclerView.setAdapter(subNewFragmentAdapter); //设施条目的适配器 //创建并设置Adapter subNewFragmentAdapter.setOnItemClickListener(new SubNewFragmentAdapter.OnRecyclerViewItemClickListener() { @Override public void onItemClick(View view, Items news) {// Toast.makeText(getContext(), "你点击了" + news.getBody() + "条目", Toast.LENGTH_SHORT).show(); Intent intent = new Intent(); intent.putExtra("news", news.getHref()); intent.setClass(getActivity().getApplicationContext(), NewFragmentItemActivity.class); startActivityForResult(intent, REQUESTCODE); } }); } private void sendRequest() { String url = "http://www.oschina.net/action/apiv2/news"; HttpParams params = new HttpParams(); params.put("pageToken", nextPageToken); HttpLoader.getInstance(getContext()).get(url, params, null,0x33, new HttpLoader.HttpListener<String>() { @Override public void onGetResponseSuccess(int requestCode, String response) { Gson gson = new Gson(); NewBean newBean = gson.fromJson(response, NewBean.class); nextPageToken = newBean.getResult().getNextPageToken(); if (isPullRefresh) { //刷新的时候清空数据 subNewFragmentAdapter.clear(); subNewFragmentAdapter.addAll(newBean.getResult().getItems()); mRecyclerView.refreshComplete(); isPullRefresh = !isPullRefresh; sendRequestImage(); } else { subNewFragmentAdapter.addAll(newBean.getResult().getItems()); mRecyclerView.loadMoreComplete(); } } @Override public void onGetResponseError(int requestCode, VolleyError error) { } }); } private void sendRequestImage() { String url = "http://www.oschina.net/action/apiv2/banner"; HttpParams params = new HttpParams(); params.put("catalog", catalog); HttpLoader.getInstance(getContext()).get(url, params, null, 12, new HttpLoader.HttpListener<String>() { @Override public void onGetResponseSuccess(int requestCode, String response) { Gson gson = new Gson(); NewBean newBean = gson.fromJson(response, NewBean.class); testNormalAdapter.clear(); testNormalAdapter.addAll(newBean.getResult().getItems()); //更新数据适配器应该在添加图片之后立马执行,先更新的话,会造成图片的集合为空 mRollViewPager.getViewPager().getAdapter().notifyDataSetChanged();// 更新banner图片 } @Override public void onGetResponseError(int requestCode, VolleyError error) { Log.d(TAG, "onGetResponseError: " + error.getMessage()); } }); } private class TestNormalAdapter extends LoopPagerAdapter { public TestNormalAdapter(RollPagerView mRollViewPager) { super(mRollViewPager); } private List<Items> Items = new ArrayList<>(); public void addAll(List<Items> datas){ Items.addAll(datas); } public void clear(){ Items.clear(); } @Override public View getView(ViewGroup container, final int position) { ImageView view = new ImageView(container.getContext()); Picasso.with(container.getContext()).load(Items.get(position).getImg()).into(view); // 加载网络图片 view.setScaleType(ImageView.ScaleType.CENTER_CROP); view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); view.setOnClickListener(new View.OnClickListener() { // 点击事件 @Override public void onClick(View view) { Intent intent = new Intent(); intent.putExtra("news", Items.get(position).getHref()); intent.setClass(getActivity().getApplicationContext(), ImageActivity.class); startActivity(intent); } }); return view; } @Override public int getRealCount() { return Items.size(); } }}
这个是adapter
public class SubNewFragmentAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements View.OnClickListener { private Activity mActivity; private List<Items> items = new ArrayList<>(); private SubNewViewHolder subNewViewHolder; public SubNewFragmentAdapter(Activity activity){ this.mActivity = activity; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(mActivity).inflate(R.layout.layout_sub_new_fragment_item, parent, false); subNewViewHolder = new SubNewViewHolder(view); //将创建的view进行点击事件 view.setOnClickListener(this); return new SubNewViewHolder(view); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { subNewViewHolder = (SubNewViewHolder) holder;// subNewViewHolder.tv_content.setText(items.get(position).getTitle()); subNewViewHolder.tv_content.setText(""); //获取文章发布的时间 String pubDate = items.get(position).getPubDate(); String time = StringUtils.friendly_time(pubDate); subNewViewHolder.tv_time.setText(time); subNewViewHolder.tv_time.setTextSize(10); //获取评论的个数 String commentCount = items.get(position).getCommentCount(); boolean today = StringUtils.isToday(pubDate); if (today){ //图片文本 showImageSpan(R.drawable.widget_today_icon); } //加粗文本 showBoldSpan(items.get(position).getTitle()); subNewViewHolder.tv_content1.setText(items.get(position).getBody()); subNewViewHolder.tv_author.setText("@"+items.get(position).getAuthor()); subNewViewHolder.tv_author.setTextSize(10); subNewViewHolder.tv_comment.setText(commentCount+""); subNewViewHolder.tv_comment.setTextSize(10); //将数据保存在itemView的Tag中,以便点击时进行获取 subNewViewHolder.itemView.setTag(items.get(position)); } @Override public int getItemCount() { return items.size(); } public void addAll(List<Items> datas){ items.addAll(datas); notifyItemRangeInserted(items.size() -1, getItemCount() + datas.size()); } public void clear(){ notifyItemRangeRemoved(1, getItemCount()); } @Override public void onClick(View view) { if (mOnItemClickListener != null){ //注意,这里使用getTag 的方法获取数据 mOnItemClickListener.onItemClick(view, (Items) view.getTag()); } } class SubNewViewHolder extends RecyclerView.ViewHolder{ private ImageView iv_image; private TextView tv_content; private TextView tv_content1; private TextView tv_author; private TextView tv_comment; private TextView tv_time; public SubNewViewHolder(View itemView) { super(itemView); iv_image = (ImageView) itemView.findViewById(R.id.iv_image); tv_content = (TextView) itemView.findViewById(R.id.tv_content); tv_content1 = (TextView) itemView.findViewById(R.id.tv_content1); tv_author = (TextView) itemView.findViewById(R.id.tv_author); tv_comment = (TextView) itemView.findViewById(R.id.tv_comment); tv_time = (TextView) itemView.findViewById(R.id.tv_time); } } public interface OnRecyclerViewItemClickListener { void onItemClick(View view, Items items); } private OnRecyclerViewItemClickListener mOnItemClickListener = null; public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) { this.mOnItemClickListener = listener; } /** * 粗体 */ private void showBoldSpan(String str) { //spanabletring: 用于格式化文本的实现类 SpannableString spanString = new SpannableString(str); //StyleSpan: 设置文本样式 StyleSpan span = new StyleSpan(Typeface.BOLD); spanString.setSpan(span, 0, str.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); subNewViewHolder.tv_content.append(spanString); } /** * 图片 */ private void showImageSpan(int resId) { SpannableString spanString = new SpannableString(" "); Drawable d = mActivity.getResources().getDrawable(resId); d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight()); ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BASELINE); spanString.setSpan(span, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); subNewViewHolder.tv_content.append(spanString); }}
最后这是一个简书上的作者写的注意事项,感觉很实用,在此转载一下
作者:Hello_Google
链接:http://www.jianshu.com/p/ed15eca82fd7
來源:简书
LayoutManager 勿使用系统自身的,下面说明其对应的关系
XLinearLayoutManager –> LinearLayoutManager
XGridLayoutManager –> GridLayoutManager
XStaggeredGridLayoutManager –> StaggeredGridLayoutManager
如果不使用 mXRecyclerView.addHeaderView() 方法,会有一个默认的下拉刷新布局
mXRecyclerView.addHeaderView(View view, int viewHeight),对应的参数分别表示为 下拉刷新头部 view 和 view 的高度(必须指定高度),这个方法会默认下拉刷新的最大距离为 2 倍的 viewHeight
mXRecyclerView.addHeaderView(View view, int viewHeight, int expandHeight),这个方法多了一个参数, expandHeight 表示下拉刷新的滑动距离,最终的滑动距离 为 expandHeight + viewHeight
如果不使用 mXRecyclerView.addFootView() 方法,则不存在加载更多操作
mXRecyclerView.addFootView(View view, int footerHeight),对应的方法参数表示为 上拉加载更多的 view 和 view 的高度(必须指定高度),这个方法默认是滑倒底部就会自动加载
mXRecyclerView.addFootView(View view, int footerHeight, boolean isManual),这个方法多了一个参数, isManual 表示是否手动上拉加载触发加载更多数据, false 表示 自动触发, true 表示 手动触发,上一个方法默认是 false
setOnRefreshListener 必须声明,否则也就达不到下拉刷新的操作了
setOnLoadMoreListener 可有可无,如果没有使用 addFootView 方法,则不用声明
mXRecyclerView.setEnableRefreshAndLoadMore(boolean) 表示是否开启下拉刷新和加载更多操作,false 表示 不开启, true 表示开启,默认是 true
mXRecyclerView.setRefresh(boolean) 表示是否开启下拉刷新,主要用于第一次加载数据时,自动触发下拉刷新操作, false 表示 第一次加载数据不会触发下拉刷新, true 表示 会下拉刷新,默认是 false
mXRecyclerView.destroyHandler() 该方法最好在 onDestroy() 中调用
- XRecyclerView的使用
- XRecyclerView的使用
- XRecyclerView的使用
- XRecyclerView 的简单使用
- Xrecyclerview的使用
- XRecyclerView与轮播图的使用
- XRecyclerView的使用下拉刷新
- XRecyclerView使用
- Android XRecyclerview的简单使用步骤
- XRecyclerView的使用&ListView|XRecyclerView有header时Position不对问题
- XRecyclerView上下拉使用
- XRecyclerView上下拉使用
- XrecyclerView简单使用
- XRecyclerView上下拉使用
- 支持下拉刷新上拉加载xrecyclerview的基本使用
- Xrecyclerview的使用(上拉刷新,下拉加载)
- XRecyclerView
- XrecyclerView
- 1003: [ZJOI2006]物流运输 最短路+dp
- Java并发之FairSync和NonfairSync
- 代码 示例 让每个方法尽量粒度小点
- 03-指令ng-bind
- 【git】git一般操作流程
- XRecyclerView的使用
- 暑假兴趣小组实训
- 【JAVA300】6-10 笔记
- html笔记——设置动态宽度的div为正方形
- LeetCode--Generate Parentheses
- import_
- 学习曲线
- CMake使用简介(for Linux)
- java类的加载(包含有static定义的方法和变量)