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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章