首页 > 代码库 > Android-RecylerView控件

Android-RecylerView控件

 RecylerView是Android5.0推出的新控件,相较于ListView和GridView,RecylerView有以下几个特点:

   1、不关心Item是否显示在正确的位置上,如何显示。利用LayoutManager来控制RecylerView的显示风格

   2、不关心Item之间如何分割。 利用ItemDecoration来设置分割线的效果

   3、不关心Item增加与删除的动画效果。利用ItemAnimator来控制动画效果

   4、仅仅关注如何回收和复用View。

  在RecyLerView中,强制我们使用ViewHolder的模式,这一点要记得。

1.建立布局文件

   A、建立每个Item的布局

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="match_parent"
 4     android:background="#44ff"
 5     android:layout_margin="3dp"
 6     android:layout_height="match_parent">
 7     <TextView
 8         android:id="@+id/id_textView"
 9         android:layout_width="match_parent"
10         android:layout_height="wrap_content"
11         android:gravity="center"
12         />
13 </LinearLayout>

  B、建立主布局

<?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"
    tools:context="com.example.android_recylerview.MainActivity">
    <android.support.v7.widget.RecyclerView
        android:id="@+id/id_recylerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</RelativeLayout>

2.实现RecylerView的Adapter

 1 package com.example.android_recylerview;
 2 
 3 import android.content.Context;
 4 import android.support.v7.widget.RecyclerView;
 5 import android.view.LayoutInflater;
 6 import android.view.View;
 7 import android.view.ViewGroup;
 8 import android.widget.TextView;
 9 
10 import java.util.List;
11 
12 /**
13  * Created by 前世诀别的一纸书 on 2017/2/23.
14  */
15 
16 public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
17 
18     private LayoutInflater mInflater = null;
19     private List<String> mDatas = null;
20     public MyAdapter(Context context, List<String> datas)
21     {
22         this.mDatas = datas;
23         this.mInflater = LayoutInflater.from(context);
24     }
25     //创建ViewHolder
26     @Override
27     public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
28         View view = mInflater.inflate(R.layout.item_layout, parent, false);
29         MyViewHolder viewHolder = new MyViewHolder(view);
30         return viewHolder;
31     }
32     //绑定ViewHolder
33     @Override
34     public void onBindViewHolder(MyViewHolder holder, int position) {
35         holder.mTextView.setText(mDatas.get(position));
36     }
37 
38     @Override
39     public int getItemCount() {
40         return mDatas.size();
41     }
42     class MyViewHolder extends RecyclerView.ViewHolder
43     {
44         public TextView mTextView = null;
45         public MyViewHolder(View itemView) {
46             super(itemView);
47             mTextView = (TextView) itemView.findViewById(R.id.id_textView);
48         }
49     }
50 }

4.在MainActivity中使用RecylerView

 //设置布局管理
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL, false); // LinearLayout的布局
        GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 4);  // GridView的布局
        StaggeredGridLayoutManager gridLayoutManager1 = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.HORIZONTAL); // 水平的GridView的布局
        mRecylerView.setLayoutManager(gridLayoutManager1);
        //设置分割线
        //mRecylerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST));

5.将GridView变为瀑布流

   以下的代码是在eclipse上实现的,我没在Android studio 上实现成功。。。。

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="match_parent"
 4     android:layout_height="72dp"
 5     android:background="#44ff"
 6     android:layout_margin="3dp"
 7     android:orientation="vertical" >
 8     <TextView 
 9         
10         android:id="@+id/id_textView"
11         android:layout_width="match_parent"
12         android:layout_height="match_parent"
13         android:gravity="center"
14         />
15 
16 </FrameLayout>

  同时Myadapter上里面定义一个List类型的数组,用来存储每个Item的高度,而初始化List数组是利用随机数来初始化的

1         for(int i = 0; i < mDatas.size(); i++)
2         {
3             mHeights.add((int) (100 + Math.random() * 400));
4         }

  初始化成功后,在onBindVIewHolder中使用

1     //绑定ViewHolder
2     @Override
3     public void onBindViewHolder(MyViewHolder holder, int position) {
4         ViewGroup.LayoutParams layoutParams = holder.mTextView.getLayoutParams();
5         layoutParams.height = mHeights.get(position);
6         holder.mTextView.setLayoutParams(layoutParams);
7         holder.mTextView.setText(mDatas.get(position));
8 
9     }

6.增加和删除Item的功能

  在menu文件下,增加几个Item,将这几个Item加在ActionBar上面

 1 <item
 2         android:id="@+id/action_add"
 3         android:orderInCategory="100"
 4         android:showAsAction="ifRoom"
 5         android:icon="@drawable/ic_menu_add"
 6         android:title="Add"/>
 7     <item
 8         android:id="@+id/action_delete"
 9         android:orderInCategory="100"
10         android:showAsAction="ifRoom"
11         android:icon="@drawable/ic_menu_delete"
12         android:title="Delete"/>

7.为RecylerView添加动画

   这个动画是系统给我们的,是系统实现的

1 mRecylerView.setItemAnimator(new DefaultItemAnimator());

 

Android-RecylerView控件