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() 中调用

原创粉丝点击