XRecyclerView的使用

之前开发,一直使用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() 中调用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值