Recycleview实现下拉刷新&上拉加载更多

一.下拉刷新
话不多说,前段时间做项目的时候刚用到过,分享出来集思广益,欢迎指出不足。本文主要利用SwipeRefreshLayout嵌套Recycleview实现简单的下拉刷新功能。

1.XML文件:

                       <?xml version="1.0" encoding="utf-8"?>
                    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">

    <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/swiperefreshlayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:scrollbars="vertical" />

    </android.support.v4.widget.SwipeRefreshLayout>


 </LinearLayout>

2.代码:Activity的OnCreate方法里只要添加几行代码就可实现下拉刷新的效果

                 swiperefreshlayout.setOnRefreshListener(this);
                 swiperefreshlayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
         //发送网络请求
            sendRequest();
         //停止刷新
            swiperefreshlayout.setRefreshing(false);
         //刷新RecycleView
            mRecycleViewAdapter.notifyDataSetChanged();
        }
    });

二.上拉加载更多
看过网上很多关于上拉加载更多的文章,最后总结测试了一下,就有了适合自己的简单的上拉加载更多。主要采用Recycleview设置一个FootViewHolder,并监听Recycleview的滑动状态来实现效果。直接贴代码吧(Copy不能运行,只能自己截取有用的部分加以利用,耐着性子看完,相信会有收获哦)

1.XML文件:

                    <?xml version="1.0" encoding="utf-8"?>
                   <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">

    <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/swiperefreshlayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:scrollbars="vertical" />

    </android.support.v4.widget.SwipeRefreshLayout>

2.代码(主要为网络请求到的数据Copy无效,其他各位看官随意蹂躏):

1.Activity:

            public class MyActivity extends AppCompatActivity {
private NoticeAdapter adapter;
private RecyclerView noticeRecyclerview;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    initData();
}

private void initData() {
    //news为你第一次发送网络请求获取到的List集合,这里就不贴了
    adapter = new NoticeAdapter(this,news);
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
    noticeRecyclerview.setLayoutManager(linearLayoutManager);
    noticeRecyclerview.setAdapter(adapter);
    noticeRecyclerview.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
    noticeRecyclerview.addOnScrollListener(monScrollListener);
    adapter.notifyDataSetChanged();
}
       //本段可直接Copy,作用是监听Recycleview是否滑动到底部
private int mLastVisibleItemPosition;
private RecyclerView.OnScrollListener monScrollListener = new RecyclerView.OnScrollListener() {

    @Override
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
        RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
        if (layoutManager instanceof LinearLayoutManager) {
            mLastVisibleItemPosition = ((LinearLayoutManager) layoutManager).findLastVisibleItemPosition();
        }
        if (adapter != null) {
            if (newState == RecyclerView.SCROLL_STATE_IDLE
                    && mLastVisibleItemPosition + 1 == adapter.getItemCount()) {
                //发送网络请求获取更多数据
                sendMoreRequest();
            }
        }
    }


};

private void sendMoreRequest() {
    //可直接查看下面onResponse方法,网络请求操作不必细看
    String url = Constant.BaseUrl + "getNews";
    final String s = MD5Tools.MD5(MD5Tools.MD5("NEW"));
    OkHttpUtils.post().url(url)
            .addParams("FKEY", s)
            .build()
            .execute(new StringCallback() {
                @Override
                public void onError(Call call, Exception e, int id) {
                }
                @Override
                public void onResponse(String response, int id) {
                    NoticeBean noticeBean = new Gson().fromJson(response.toString(), NoticeBean.class);
                    //result == 1表示请求成功
                    if (noticeBean.getResult()== 1){
                        //判断请求的数据集合是否不为空
                        if (noticeBean.getNews().size()!=0){
                            //不为空,则添加数据
                            adapter.addList(noticeBean.getNews());
                        }else {
                            //为空,则调用adapter里面的方法隐藏FootView
                            adapter.setIsLoadMore();
                        }
                    }
                }
            });
}

}

2.Adapter:

 public class NoticeAdapter extends RecyclerView.Adapter{
private List<NoticeBean.NewsBean> list;
private Context mContext;
    //上拉加载更多布局
public static final int view_Foot = 1;
      //主要布局
public static final int view_Normal = 2;
     //是否隐藏
public boolean isLoadMore = false;

public NoticeAdapter(Context mContext, List<NoticeBean.NewsBean> list) {
    this.list = list;
    this.mContext = mContext;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    if (viewType ==view_Normal ){
        NoticeItemView noticeItemView = new NoticeItemView(mContext);
        NoticeViewHolder viewHolder = new NoticeViewHolder(noticeItemView);
        return viewHolder;
    }else {
        FootView view = new FootView(mContext);
        FootViewHolder footViewHolder = new FootViewHolder(view);
        return footViewHolder;
    }

}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    if (position == getItemCount()-1){
        FootView itemView = (FootView) holder.itemView;
        if (isLoadMore){
            itemView.setData();
        }else {
            itemView.setVisibility(View.VISIBLE);

        }
    }else {
        NoticeItemView itemView = (NoticeItemView) holder.itemView;
        itemView.setData(list.get(position));
    }

}

@Override
public int getItemCount() {
    return list.size()+1;
}

@Override
public int getItemViewType(int position) {
    if (position == getItemCount()-1){
        return view_Foot;
    }else {
        return view_Normal;
    }
}

public void addList(List<NoticeBean.NewsBean> news) {
    list.addAll(news);
    notifyDataSetChanged();
}

public void setIsLoadMore() {
    this.isLoadMore = true;
    notifyDataSetChanged();
}

static class NoticeViewHolder extends RecyclerView.ViewHolder {
    public NoticeViewHolder(View itemView) {
        super(itemView);
    }
}
static class FootViewHolder extends RecyclerView.ViewHolder {
    public FootViewHolder(View itemView) {
        super(itemView);
    }
}

}

3.FootView为自定义控件,NoticeItemView和FootView大同小异,就不贴代码了,FootView代码如下

       public class FootView extends RelativeLayout {

@BindView(R.id.foot_view_progressbar)
ProgressBar footViewProgressbar;

public FootView(Context context) {
    this(context, null);
}

public FootView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
}

private void init() {
    View.inflate(getContext(), R.layout.foot_view, this);
    ButterKnife.bind(this,this);
}

public void setData() {
footViewProgressbar.setVisibility(GONE);
}

}

4.FootView的XML文件:

        <?xml version="1.0" encoding="utf-8"?>
       <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">

<ProgressBar
    android:id="@+id/foot_view_progressbar"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"/>

</LinearLayout>

四.后续会更新源码至GitHub,有兴趣的同学可关注微信公众号MiHomes。

末尾:移动互联&人力资源交流群,可加微信zy666128入群交流。


image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,219评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,363评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,933评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,020评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,400评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,640评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,896评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,597评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,327评论 1 244
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,581评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,072评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,399评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,054评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,849评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,672评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,585评论 2 270

推荐阅读更多精彩内容