刷新控件MaterialRefreshLayout

博主觉得这控件用起来还不错,推荐给大家。顺带记录一下,方便日后学习。此博文是结合网上多个博主的解读,综合性的一个转载博文。


MaterialRefreshLayout是一个非常完美的下拉刷新上拉加载控件,类似于LinearLayout。使用也很容易:

①加入依赖

    compile 'com.cjj.materialrefeshlayout:library:1.3.0'

②在布局文件中加入MaterialLayout,其中放置RecyclerView

<com.cjj.MaterialRefreshLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/refresh"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:overlay="false"
    app:wave_show="true"
    app:wave_color="@color/material_green"
    app:wave_height_type="normal"
    >

    <android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/recycler_view_hot"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"/>

</com.cjj.MaterialRefreshLayout>


③实例化MaterialRefreshLayout和 RecyclerView

@ViewInject(R.id.recycler_view_hot)
private RecyclerView mRecyclerView;

@ViewInject(R.id.refresh)
private MaterialRefreshLayout materialRefreshLayout;

 

④获得数据,计算当前页,总页数和每页的数目,用于MaterialRefreshLayout进行分页处理

private int totlaPage 1;
private int curPage 1;
private int pageSize 10;
private OkHttpHelper httpHelper = OkHttpHelper.getInstance();
private List<Wares> waresList new ArrayList<>();
private void getData( ){
    httpHelper.get(url, new SpotsCallBack<Page<Wares>>(getContext()) {
        @Override
        public void onSuccess(Response responsePage<Wares> waresPage) {
            waresList = waresPage.getList();
            curPage = waresPage.getCurrentPage();
            pageSize = waresPage.getPageSize();
            totlaPage = waresPage.getTotalPage();
            showData();
        }
        @Override
        public void onError(Response response, int codeException e) {
        }
    });
}

RecyclerView显示数据,此时RecyclerView不知是按照之前的方式(设置适配器)来显示数据了,而是按照不同的状态来显示数据

private static final int STATE_NORMAL 0;
private static final int STATE_REFREN 1;
private static final int STATE_MORE 2;
private int state STATE_NORMAL;
private HotWaresAdapter hotWaresAdapter;
private void showData(){
    switch (state){
        case STATE_NORMAL:
            hotWaresAdapter new HotWaresAdapter(waresList);
            mRecyclerView.setAdapter(hotWaresAdapter);
            final LinearLayoutManager layoutManager = 

                  new LinearLayoutManager(HotFragment.this.getActivity());
            mRecyclerView.setLayoutManager(layoutManager);
            mRecyclerView.setItemAnimator(new DefaultItemAnimator());
            mRecyclerView.addItemDecoration(

                      new DividerItemDecoration(HotFragment.this.getContext()

                                  DividerItemDecoration.HORIZONTAL_LIST));
            break;

        case STATE_REFREN:
            hotWaresAdapter.clearData();
            hotWaresAdapter.addData(waresList);
            mRecyclerView.scrollToPosition(0);
            materialRefreshLayout.finishRefresh();
            break;

        case STATE_MORE:
            hotWaresAdapter.addData(hotWaresAdapter.getDatas().size()waresList);
            mRecyclerView.scrollToPosition(hotWaresAdapter.getDatas().size());
            materialRefreshLayout.finishRefreshLoadMore();
            break;
    }
}

 

⑥为MaterialRefreshLayout添加监听器,来实现下拉刷新和上拉加载时的逻辑

private void initMaterialRefreshLayout(){
    materialRefreshLayout.setLoadMore(true);
    materialRefreshLayout.setMaterialRefreshListener(new MaterialRefreshListener() {
           @Override
           public void onRefresh(final MaterialRefreshLayout materialRefreshLayout) {
                   //refreshing...
               refreshData();
           }
           @Override
           public void onRefreshLoadMore(MaterialRefreshLayout materialRefreshLayout) {
               //load more refreshing...
               if(curPage <= totlaPage)
                     loadMore();
               else {
                   Toast.makeText(getContext()"没有更多了..."Toast.LENGTH_LONG).show();
                   materialRefreshLayout.finishRefreshLoadMore();
               }
           }
    });
}
public void refreshData(){
    curPage 1;
    state STATE_REFREN;
    getData();
}
private void loadMore(){
    curPage curPage 1;
    state STATE_MORE;
    getData();
}

 

⑦适配器,用Fresco来加载图片

public class HotWaresAdapter extends RecyclerView.Adapter<HotWaresAdapter.ViewHolder>  {
    private List<Wares> mDatas;
    private LayoutInflater mInflater;
    public HotWaresAdapter(List<Wares> wares){
        mDatas = wares;
    }
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        mInflater = LayoutInflater.from(parent.getContext());
        View view = mInflater.inflate(R.layout.template_hot_wares,null);
        return new ViewHolder(view);
    }
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        Wares wares = getData(position);
        holder.draweeView.setImageURI(Uri.parse(wares.getImgUrl()));
        holder.textTitle.setText(wares.getName());
        holder.textPrice.setText("¥"+wares.getPrice())
    }
    public Wares getData(int position){
        return mDatas.get(position);
    }
    public List<Wares> getDatas(){
        return  mDatas;
    }
    public void clearData(){
        mDatas.clear();
        notifyItemRangeRemoved(0,mDatas.size());
    }
    public void addData(List<Wares> datas){

        addData(0,datas);
    }
    public void addData(int position,List<Wares> datas){
        if(datas !=null && datas.size()>0) {
            mDatas.addAll(datas);
            notifyItemRangeChanged(positionmDatas.size());
        }
    }
    @Override
    public int getItemCount() {
        if(mDatas!=null && mDatas.size()>0)
            return mDatas.size();
        return 0;
    }
    class ViewHolder extends RecyclerView.ViewHolder{
        SimpleDraweeView draweeView;
        TextView textTitle;
        TextView textPrice;
        public ViewHolder(View itemView) {
            super(itemView);
            draweeView = (SimpleDraweeView) itemView.findViewById(R.id.drawee_view);
            textTitle= (TextView) itemView.findViewById(R.id.text_title);
            textPrice= (TextView) itemView.findViewById(R.id.text_price);
        }
    }
}


下面则是里面自定义属性的一些说明:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- style for MaterialRefreshLayout  -->
    <declare-styleable name="MaterialRefreshLayout">
        <!--设置刷新是入侵式还是非入侵式-->
        <attr name="overlay" format="boolean"/>
        <!-- style for MaterialWaveView  -->
        <!--设置波浪的高度-->
        <attr name="wave_height_type" format="enum">
            <enum name="normal" value="0"/>
            <enum name="higher" value="1"/>
        </attr>
        <!--设置波浪的颜色-->
        <attr name="wave_color" format="color"/>
        <!--设置是否使用波浪效果-->
        <attr name="wave_show" format="boolean"/>
        <!-- style for CircleProgressBar  -->
        <!--设置圆圈变换的颜色-->
        <attr name="progress_colors" format="reference"/>
        <!--暂不明确-->
        <attr name="progress_stoke_width" format="dimension"/>
        <!--设置圆圈的背景-->
        <attr name="progress_backgroud_color" format="color"/>
        <!--是否显示箭头-->
        <attr name="progress_show_arrow" format="boolean"/>
        <!--箭头宽度-->
        <attr name="progress_arrow_width" format="dimension"/>
        <!--箭头高度-->
        <attr name="progress_arrow_height" format="dimension"/>
        <!--是否显示圆圈的背景-->
        <attr name="progress_show_circle_backgroud" format="boolean"/>
        <!--设置文字进度-->
        <attr name="progress_value" format="integer"/>
        <!--设置文字进度的最大值-->
        <attr name="progress_max_value" format="integer"/>
        <!--设置文字大小-->
        <attr name="progress_text_size" format="dimension"/>
        <!--设置文字颜色-->
        <attr name="progress_text_color" format="color"/>
        <!--是否显示文字进度-->
        <attr name="progress_text_visibility" format="enum">
            <enum name="visible" value="0"/>
            <enum name="invisible" value="1"/>
        </attr>
        <!--暂不明确-->
        <attr name="progress_size_type" format="enum">
            <enum name="normal" value="0"></enum>
            <enum name="big" value="1"></enum>
        </attr>
        <!--是否加载更多-->
        <attr name="isLoadMore" format="boolean"></attr>
    </declare-styleable>
</resources>

3. 缺憾:

此框架使用起来很简单,也支持一些效果的设置,但是还是有一些缺憾: 
(1)不支持自定义刷新样式,框架中只有两种样式,小圆圈跟一个小太阳,要使用其他样式估计要自己改框架了 
(2)加载更多过度不够平滑,也不支持非入侵式。 

中文文档地址: https://github.com/android-cjj/Android-MaterialRefreshLayout/blob/master/README-cn.md

demo地址(as):https://github.com/android-cjj/Android-MaterialRefreshLayout


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值