RecyclerView的使用

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控件


<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.csdn.net/lmj623565791/article/details/45059587

你可能感兴趣的:(android,android,新特性)