Android实现RecyclerView自定义列表,SwipeRefreshLayout实现下拉刷新

转载 2016年08月30日 11:02:53

Android使用RecyclerView

这里写图片描述

1. 什么是RecyclerView

RecyclerView 是 Android-support-v7-21 版本中新增的一个 Widgets,官方对于它的介绍则是:RecyclerView 是 ListView 的升级版本,更加先进和灵活。

简单来说就是:RecyclerView是一种新的视图组,目标是为任何基于适配器的视图提供相似的渲染方式。它被作为ListView和GridView控件的继承者,在最新的support-V7版本中提供支持。

2. 使用RecyclerView需要掌握什么

  • Adapter — 包装数据集合并且为每个条目创建视图
  • LayoutManager — 将每个条目的视图放置于适当的位置
  • OnItemClickListener — 给每个条目设置点击事件
  • SwipeRefreshLayout — 给RecyclerView添加下拉刷新事件
  • ItemAnimator — 在每个条目的视图的周围或上面绘制一些装饰视图
  • ItemDecoration — 在条目被添加、移除或者重排序时添加动画效果

3. 使用RecyclerView前需要准备什么

添加依赖包(以Android Studio为例)

这里写图片描述

这里写图片描述

这里写图片描述

4. 自定义Adapter

RecyclerView.Adapter包含了一种新型适配器,其实与以前我们使用的适配器基本类似,只是稍微有所不同,比如viewholder它帮我们封装好了,不用像以前使用listview的适配器一样自己去写viewholder了。

Item视图如下:

这里写图片描述

实例代码如下:

public class RecyclerAdapter extends RecyclerView.Adapter {

    private List<Model> models;

    public RecyclerAdapter(List<Model> models){
        this.models = models;
    }

    class ViewHolder extends RecyclerView.ViewHolder{

        private ImageView picture;
        private TextView title,text;

        public ViewHolder(View itemView) {
            super(itemView);

            picture = (ImageView) itemView.findViewById(R.id.picture);
            title = (TextView) itemView.findViewById(R.id.title);
            text = (TextView) itemView.findViewById(R.id.text);
        }

        public ImageView getPicture(){
            return picture;
        }

        public TextView getTitle(){
            return title;
        }

        public TextView getText(){
            return text;
        }
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_view,null));
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {

        final ViewHolder vh = (ViewHolder) holder;
        vh.getPicture().setImageResource(models.get(position).getPicture());
        vh.getTitle().setText(models.get(position).getTitle());
        vh.getText().setText(models.get(position).getText());
    }

    @Override
    public int getItemCount() {
        return models.size();
    }
}

5. LayoutManager有什么作用

由于RecyclerView已经不单单像以前ListView或者GridView一样,它被作为ListView和GridView控件的继承者,所以在使用它的时候需要通过设置它的LayoutManager去规定它是哪一种类型,另外也可通过设置LayoutManager去设置它是横向还是纵向的列表,以及是否反转。

纵向列表:(第三个参数是设置是否反转,即滑动方向)

mLayoutManager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
recyclerview.setLayoutManager(mLayoutManager);

这里写图片描述

横向列表:

mLayoutManager = new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false);
recyclerview.setLayoutManager(mLayoutManager);

这里写图片描述

垂直表格布局:

mLayoutManager = new GridLayoutManager(this,2);
recyclerview.setLayoutManager(mLayoutManager);

水平表格布局:(第四个参数代表是否反转)

mLayoutManager = new GridLayoutManager(this,2,LinearLayoutManager.HORIZONTAL,false);
recyclerview.setLayoutManager(mLayoutManager);

这里写图片描述

6. 为什么要自己添加OnItemClickListener

RecyclerView有一个缺点,在RecyclerView中,没有一个onItemClickListener方法。所以目前在适配器中处理这样的事件比较好。如果想要从适配器上添加或移除条目,需要明确通知适配器。这与先前的notifyDataSetChanged()方法稍微有些不同。具体操作在适配器代码中就可以体现。

具体代码如下:

public class RecyclerAdapter extends RecyclerView.Adapter {

    private List<Model> models;

    public RecyclerAdapter(List<Model> models){
        this.models = models;
    }

    class ViewHolder extends RecyclerView.ViewHolder{

        private ImageView picture;
        private TextView title,text;

        public ViewHolder(View itemView) {
            super(itemView);

            picture = (ImageView) itemView.findViewById(R.id.picture);
            title = (TextView) itemView.findViewById(R.id.title);
            text = (TextView) itemView.findViewById(R.id.text);
        }

        public ImageView getPicture(){
            return picture;
        }

        public TextView getTitle(){
            return title;
        }

        public TextView getText(){
            return text;
        }
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_view,null));
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {

        final ViewHolder vh = (ViewHolder) holder;
        vh.getPicture().setImageResource(models.get(position).getPicture());
        vh.getTitle().setText(models.get(position).getTitle());
        vh.getText().setText(models.get(position).getText());

        //如果设置了回调,就设置点击事件
        if (mOnItemClickListener != null){
            vh.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    mOnItemClickListener.onItemClick(vh.itemView,position);
                }
            });
        }
    }

    @Override
    public int getItemCount() {
        return models.size();
    }

    /** * ItemClick的回调接口 */
    public interface OnItemClickListener{
        void onItemClick(View view,int position);
    }

    private OnItemClickListener mOnItemClickListener;

    public void setmOnItemClickListener(OnItemClickListener mOnItemClickListener){
        this.mOnItemClickListener = mOnItemClickListener;
    }
}

7. 实现下拉刷新与上拉加载更多

其实跟以前一样,原生的ListView或者GridView都不能满足实际App的需要,很多时候都要通过自定义View去实现列表的下拉刷新和上拉加载,RecyclerView也是一样,不过这里不会介绍如何去自定义RecyclerView,相反,我们会借用SwipeRefreshLayout这个组件,更快地去实现列表刷新功能

界面布局如下:

<view
        android:id="@+id/swipeRefreshLayout"
        class="android.support.v4.widget.SwipeRefreshLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/recyclerview"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

        </android.support.v7.widget.RecyclerView>

</view>

设置下拉刷新监听事件:

swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipeRefreshLayout);
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                //重新获取数据
                //获取完成swipeRefreshLayout.setRefreshing(false);
            }
});

设置上拉加载更多可以通过设置滑动监听事件来实现:

recyclerview.setOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                if (newState == RecyclerView.SCROLL_STATE_IDLE
                        && lastVisibleItem + 1 == adapter.getItemCount()) {
                    swipeRefreshLayout.setRefreshing(true);

                    //分页获取数据
                    //获取完成swipeRefreshLayout.setRefreshing(false);
                }
            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                lastVisibleItem = mLayoutManager.findLastVisibleItemPosition();
            }
        });

8. ItemAnimator 与ItemDecorator

由于RecyclerView里没有自带分割线,所以就出现了ItemDecorator,但其实还有另外一种方法,就是直接在Item界面布局中添加分割线,这样可以省去很多代码;
而ItemAnimator简单来说是会根据适配器上收到的相关通知去动画的显示组件的修改,添加和删除等。它会自动添加和移除item的动画。自带的默认效果也不错,已经非常好了。因为这两项不是很常用,所以这里就不多加介绍了,有兴趣的同学可以上网找详细的资料学习。

来自: http://blog.csdn.net/u014756589/article/details/51280659

SwipeRefreshLayout-下拉刷新控件

SwipeRefreshLayout彩虹条加载进度
  • Z18789231876
  • Z18789231876
  • 2016年04月22日 18:00
  • 799

使用SwipeRefreshLayout和RecyclerView实现下拉刷新上拉加载更多

效果图: 文件目录 布局文件
  • zhe_ge_sha_shou
  • zhe_ge_sha_shou
  • 2017年03月28日 19:42
  • 729

详解自主实现RecyclerView下拉刷新、上拉加载、Header、Footer以及swiperefreshlayout的部分讲解

实现recyclerview的下拉刷新,和很多人用的一样,使用的是swiperefreshlayout + recyclerview的方式实现下拉刷新。 首先,附上swiperefreshlayout...
  • u011150924
  • u011150924
  • 2017年02月23日 16:36
  • 1035

Android从零开搞系列:自定义View(2)继承RecyclerView实现下拉刷新和加载更多

通过开源框架,来理解下拉刷新和加载更多的解决方案。 通过RecyclerView的Adapter来理解观察者模式。...
  • wjzj000
  • wjzj000
  • 2016年12月10日 15:22
  • 1202

SwipeRefreshLayout+RecyclerView实现下拉刷新上拉自动加载

在实际开发中,为了节省开发周期,下拉刷新上拉加载通常都会采取使用一些第三方库,典型的就是用PullToRefresh,XListView等等,还有就是谷歌推荐的SwipeRefreshLayout,可...
  • AndroidStudioo
  • AndroidStudioo
  • 2016年07月09日 19:48
  • 5530

SwipeRefreshLayout + RecyclerView 实现 上拉刷新 和 下拉加载更多

项目迭代需要更换下拉刷新和上滑加载更多的效果,就研究了一下安卓自带的刷新的控件SwipeRefreshLayout,挺好用的效果也不错,先上图: 我用的是swiperefreshlayout配合r...
  • gaowei_yb
  • gaowei_yb
  • 2016年12月07日 12:00
  • 1501

Kotlin中SwipeRefreshLayout结合RecyclerView下拉刷新上拉加载

最近做了一个纯Kotlin开发的Android开源软件,["DeepNight-in-kotlin,陪你度过每一个深夜"](https://github.com/ChenYXin/DeepNight-...
  • donkor_
  • donkor_
  • 2017年12月16日 18:03
  • 1384

使用SwipeRefreshLayout和RecyclerView实现仿“简书”下拉刷新和上拉加载更多

一、概述 我们公司目前开发的所有Android APP都是遵循iOS风格设计的,这并不是一个好现象。我决定将Android 5.x控件引入最近开发的项目中,使用RecyclerView取代以往使用的L...
  • LeoLeoHan
  • LeoLeoHan
  • 2016年03月26日 23:23
  • 45805

Android SwipeRefreshLayout和RecyclerView嵌套时 下拉刷新冲突的解决办法

先将 SwipeRefreshLayout的下拉刷新禁用 swipeRefreshLayout.setEnabled(false); 然后在RecyclerView中判断 recyclerView.s...
  • peirato_
  • peirato_
  • 2017年02月07日 17:37
  • 2881

自定义RecyclerView实现下拉刷新,加载更多

RecyclerView出来的时间已经不短了,现在估计大部分的列表类的需求实现首选肯定是RecyclerView,基本上可以跟ListView说再见了。那么问题来了,一般情况下一个列表页面都会有下拉刷...
  • qifengdeqingchen
  • qifengdeqingchen
  • 2016年08月31日 20:27
  • 6228
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android实现RecyclerView自定义列表,SwipeRefreshLayout实现下拉刷新
举报原因:
原因补充:

(最多只允许输入30个字)