RecyclerView的使用

本文详细介绍Android 5.0中引入的新控件RecyclerView的使用方法,包括添加依赖、布局配置、设置LayoutManager、添加动画效果及点击事件等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android 5.0新增一个控件RecyclerView,它是对ListView的升级。每当一个新的事物出来,我们就应该了解下,下面说说它的用法。

1.在Module 下的build.gradle下添加依赖。

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:23.4.0'
    testCompile 'junit:junit:4.12'
    //noinspection GradleCompatible//需要添加的
    compile 'com.android.support:recyclerview-v7:23.4.0'
}

2.和使用ListView一样,在布局文件中使用RecyclerView控件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="so.wih.android.huweidemo_recyclerview.MainActivity">

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

3.RecyclerView的使用比ListView复杂,因为它的功能更多更强大,需要设置的也多。①.设置LayoutManager(布局管理器)。LayoutManager有三种常见模式:线性LinearLayoutManager、与GridView效果对应的是GridLayoutManager、与瀑布流对应的还有StaggeredGridLayoutManager。②设置增加或删除条目的动画

public class MainActivity extends AppCompatActivity {

    private MyAdapter mAdapter;
    public String [] getDummyDatas = {"听见你的声音","匹诺曹","Doctor异乡人","学校2013","W两个世界"
            ,"听见你的声音","匹诺曹","Doctor异乡人","学校2013","W两个世界",
            "听见你的声音","匹诺曹","Doctor异乡人","学校2013","W两个世界",
            "听见你的声音","匹诺曹","Doctor异乡人","学校2013","W两个世界",
            "听见你的声音","匹诺曹","Doctor异乡人","学校2013","W两个世界"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        RecyclerView mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview);
        //创建默认的线性LayoutManager
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        //设置增加或删除条目的动画
        mRecyclerView.setItemAnimator( new DefaultItemAnimator());
        //如果可以确定每个item的高度是固定的,设置这个选项可以提高性能
        mRecyclerView.setHasFixedSize(true);
        //创建并设置Adapter
        mAdapter = new MyAdapter(getDummyDatas);
        mRecyclerView.setAdapter(mAdapter);

    }

4.RecyclerView的适配器。我们的adapter需要继承RecyclerView.Adapter。RecylerView封装了viewholder的回收复用,也就是说RecylerView标准化了ViewHolder,编写Adapter面向的是ViewHolder而不再是View了,复用的逻辑被封装了,写起来更加简单。
①onCreateViewHolder()
这个方法主要生成为每个Item inflater出一个View,但是该方法返回的是一个ViewHolder。该方法把View直接封装在ViewHolder中,然后我们面向的是ViewHolder这个实例,当然这个ViewHolder需要我们自己去编写。直接省去了当初的convertView.setTag(holder)和convertView.getTag()这些繁琐的步骤。
②onBindViewHolder()
这个方法主要用于适配渲染数据到View中。方法提供给你了一个viewHolder,而不是原来的convertView。
③getItemCount()
这个方法就类似于BaseAdapter的getCount方法了,即总共有多少个条目。
当我自己写的时候发现和别人写的不一样,原因是我的onCreateViewHolder方法返回的是RecyclerView.ViewHolder;onBindViewHolder方法的第一个参数也是RecyclerView.ViewHolder。达不到复用的效果

    public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder>{

        private final String[] datas;

        public MyAdapter(String[] data){
            this.datas = data ;
        }

        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerview_item, null);

            ViewHolder vh = new ViewHolder(view);
            return vh;
        }

        @Override
        public void onBindViewHolder(ViewHolder holder, int position) {
            holder.tv.setText(datas[position]);
        }

        @Override
        public int getItemCount() {
            return datas.length;
        }

        public class ViewHolder extends RecyclerView.ViewHolder{
            TextView tv;
            public ViewHolder(View itemView) {
                super(itemView);
                tv = (TextView) itemView.findViewById(R.id.textview);
            }

        }
    }

5.给RecyclerView的Item添加点击事件

        public  OnItemClickListener mOnItemClickListener ;
        public void setOnItemClickListener(OnItemClickListener onItemClickListener){
            this.mOnItemClickListener = onItemClickListener ;
        }
        interface OnItemClickListener{
            void onClick(int position);
            void onLongClick(int position);
        }
        @Override
        public void onBindViewHolder(ViewHolder holder, final int position) {
            holder.tv.setText(datas[position]);
//            textView.setText(datas[position]);
            if(mOnItemClickListener != null){
                holder.itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        mOnItemClickListener.onClick(position);
                    }
                });
                holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
                    @Override
                    public boolean onLongClick(View v) {
                        mOnItemClickListener.onLongClick(position);
                        return false;
                    }
                });
            }

        }

更多详细使用方法可以参考大神的文章:http://blog.youkuaiyun.com/lmj623565791/article/details/45059587

### 使用RecyclerView实现列表视图 #### 创建并配置RecyclerView实例 为了在Android应用程序中使用`RecyclerView`显示列表视图,首先需要获取布局文件中的`RecyclerView`对象。这可以通过调用`findViewById()`方法完成: ```java RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view); ``` 接着要为`RecyclerView`指定一个适配器(Adapter),该适配器负责提供数据给各个子项(ItemView)[^1]。 #### 设置LayoutManager 为了让`RecyclerView`知道如何排列它的孩子视图(Child View), 需要设置一个`LayoutManager`. 常见的选择有线性布局(`LinearLayoutManager`)、网格布局(`GridLayoutManager`)以及瀑布流布局(`StaggeredGridLayoutManager`). 下面是一个简单的例子展示了如何应用线性布局管理器: ```java recyclerView.setLayoutManager(new LinearLayoutManager(this)); ``` #### 定义ViewHolder与Adapter 对于每一个条目来说, `RecyclerView`利用了一个叫做`ViewHolder`的设计模式来提高性能. 这里定义了持有单个item UI元素引用的静态内部类. 之后还需要编写自定义的`Adapter`, 继承自`RecyclerView.Adapter<MyAdapter.MyViewHolder>`, 并重写几个抽象的方法如`onCreateViewHolder()`,`onBindViewHolder()`, 和`getItemCount()` 来填充实际的数据到viewholder 中去[^3]. #### 数据绑定 当设置了adapter 后就可以准备向其中添加数据源了。一般情况下我们会有一个List 或者Array 类型的数据集作为输入传递给adapter 的构造函数,在每次更新界面的时候只需要刷新这个集合再通知adapter 即可。 ```java myDataset.add("New Item"); mAdapter.notifyItemInserted(myDataset.size()-1); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值