Android学习笔记之RecyclerView详解

RecyclerView是Android 5.0引入的新特性,作为ListView和GridView的替代品,提供更灵活的布局管理。本文详细介绍了RecyclerView的用法,包括LinearLayoutManager、GridLayoutManager和StaggeredGridLayoutManager的实现,以及如何添加分割线、处理点击事件,展示了从列表到网格再到瀑布流的转换。同时,提到了RecyclerView与ListView在事件监听和动画设置上的差异。
摘要由CSDN通过智能技术生成

Android学习笔记之RecyclerView详解

  1. RecyclerView是什么?

      在android5.0,开始出现了一些新特性,其中就包括了非常受欢迎的RecyclerView。RecyclerView是一种新的视图组,其目的是为任何基于适配器的视图提供相似的渲染方式。该控件用于在有限的窗口中展示大量数据集,它被作为ListView和GirdView控件的继承者。RecyclerView高度接耦,异常的灵活,通过设置不同的LayoutManager,ItemDecoration,ItemAnimator来实现令人想象不到的效果。

2.RecyclerView的用法:
  
  自从RecyclerView的出现,慢慢的ListView 和 GridView开始要面向淘汰的边缘了。因为RecyclerView不仅仅能替代ListView和GridView,而且还具有很多你想象不到的效果,那么具体的效果,下面开始慢慢的介绍吧,先看看他的一些基本用法。

  • Datas : 要显示的数据

  • Adapter:适配器,绑定数据集

  • ViewHolder:根据当前的数据保存视图

  • LayoutManager:布局管理器,决定item如何摆放

  • ItemDecoration:对item的装饰,美化item,

  • ItemAnimator:动画(当item被增加、删除、重新摆放时才有效)

  • Listener:事件,对于事件,RecyclerView本身不提供,只得自己去实现

对于RecyclerView我们现在要掌握的主要就是他的三种管理形式:

2.1 LinearLayoutManager

线性布局,LayoutManager的实现类,类似于实现ListView的风格,一般
ListView只有垂直的方向,而这里可包含两种类型,Vertical和Horizontal

2.2 GridLayoutManager

格子布局、继承自LinearLayoutManager,实现效果类似GridView

2.3 StaggeredGridLayoutManager

交错的格子布局、同样也是LayoutManager的实现类,类型包括Vertical和Horizontal,与GridLayoutManager很相似,不过是交错的格子,也就是宽高不等的格子视图、类似瀑布流的效果。

其次,我们需要掌握他的一些点击和长按事件,对于RecyclerView其本身没有给我们提供这些事件监听,所以,对于这些事件,我们还得自己去实现。
 
3. 首先先看看类似于ListView的布局实现。

基本步奏:(由于这是新特性包中给我们提供的,所以我们需要先导入RecyclerView依赖包)
在build.gradle中添加如下一句代码,记住,是对应module下面的build.gradle,不是project下的build.gradle

dependencies {
    .....
    //添加此依赖
    compile 'com.android.support:recyclerview-v7:24.2.1'
}

3.1 在布局文件中添加RecyclerView控件

3.2 创建item的子布局,和ListView一样,需要有一个item对应的子布局

3.3 创建适配器

3.4 创建并设置对应的布局管理器

3.5 设置Adapter适配器

具体代码实现如下:

activity_main_list.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

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

recycler_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="100dp"
    android:gravity="center"
    android:background="@color/colorAccent"
    android:padding="15dp">

    <TextView
        android:id="@+id/mItem"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"

        android:gravity="center" />
</LinearLayout>

这里我们需要注意一下布局中的几个参数的区别,在ListView中,(假如也是使用上面的布局)不管你对layout_width 和layout_height设置为wrap_content也好还是match_parent,对item的高度都不会有什么影响,因为ListView会对你的item布局进行管理,所以你设置的高宽会无效,但是如果在RecyclerView中,设置对应的item高宽度的话,那么是会有影响的,因为RecyclerView不会去管理你的item布局,它只会按你设置的具体情况来显示。假如,你设置layout_height为match_parent,那么最后的显示效果是,你的整个一个界面中就只有一个布局item。也就是说这个item布局会占满整个屏幕。

创建自定义的适配器

MyRecylerAdapter.java

public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.ViewHolder> {
   
    //数据源
    private List<String> mData;
    //上下文
    private Context mContext;
    //布局解析器
    private LayoutInflater mInflater;
    public MyRecyclerAdapter(Context context, List<String> data){
        mContext = context;
        mData = data;
        mInflater = LayoutInflater.from(mContext);
    }
    //创建ViewHolder,相当于ListView Adapter的getView方法
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = mInflater.inflate(R.layout.recycler_item,parent,false);
        return new ViewHolder(itemView);
    }
    //数据绑定
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.mText.setText(mData.get(position));
    }

    //数据的长度
    @Override
    public int getItemCount() {
        return mData == null ? 0 : mData.size();
    }

    //ViewHolder,需要继承RecyclerView.ViewHolder
    public static class ViewHolder extends RecyclerView.ViewHolder{
   
        private TextView mText;
        public ViewHolder(View itemView) {
            super(itemView);
            mText = (TextView)itemView.findViewById(R.id.mItem);
        }
    }
}

创建并设置对应的布局管理器和适配器

public class MainActivityRecyclerViewList extends AppCompatActivity {
   
    private RecyclerView mRecycler;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_list);
        //查找控件ID
        mRecycler = (RecyclerView)findViewById(R.id.mRecyclerList);
        //创建布局管理器
        LinearLayoutManager manager = new LinearLayoutManager(this);
        //设置布局管理器,默认item方向为垂直
        mRecycler.setLayoutManager(manager);
        //创建适配器
        MyRecyclerAdapter adapter = new MyRecyclerAdapter(this, getData());
        //设置适配器
        mRecycler.setAdapter(adapter);
    }
    //设置数据源
    public List<String> getData() {
        List<String> data = new ArrayList<>();
        for(int i = 0; i 
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值