AndroidRecyclerView完全解析

  • 格式:pdf
  • 大小:369.08 KB
  • 文档页数:7

AndroidRecyclerView完全解析

RecyclerView完全解析

(⼀) 前⾔

话说RecyclerView已经⾯市很久,也在很多应⽤中得到⼴泛的使⽤,在整个开发者圈⼦⾥⾯也拥有很不错的⼝碑,那说明RecyclerView拥有⽐ListView,GridView之类控件有很

多的优点,例如:数据绑定,Item View创建,View的回收以及重⽤等机制。那么今天看⼀下RecyclerView控件,本系列⽂章会包括到以下三个部分:

1. RecyclerView控件的基本使⽤,包括基础,进阶,⾼级部分,动画之类

2. RecyclerView控件的实战实例

3. RecyclerView控件集合AA(Android Annotations)注⼊框架实例

那么今天我们⾸先来看第⼀部分:RecyclerView控件的基本使⽤,进阶,动画相关知识点。本次讲解所有⽤的Demo例⼦已经全部更新到下⾯的项⽬中了,欢迎⼤家star和fork。

FastDev4Android框架项⽬地址:https://github.com/jiangqqlmj/FastDev4Android

(⼆) RecyclerView基本介绍

通过使⽤RecyclerView控件,我们可以在APP中创建带有Material Design风格的复杂列表。RecyclerView控件和ListView的原理有很多相似的地⽅,都是维护少量的View来

进⾏显⽰⼤量的数据,不过RecyclerView控件⽐ListView更加⾼级并且更加灵活。当我们的数据因为⽤户事件或者⽹络事件发⽣改变的时候也能很好的进⾏显⽰。和ListView不

同的是,RecyclerView不⽤在负责Item的显⽰相关的功能,在这边所有有关布局,绘制,数据绑定等都被分拆成不同的类进⾏管理,下⾯我这边会⼀个个的进⾏讲解。同时

RecyclerView控件提供了以下两种⽅法来进⾏简化和处理⼤数量集合:

1. 采⽤LayoutManager来处理Item的布局

2. 提供Item操作的默认动画,例如在增加或者删除item的时候

你也可以⾃定义LayoutManager或者设置添加/删除的动画,整体的RecyclerView结构图如下:

为了使⽤RecyclerView控件,我们需要创建⼀个Adapter和⼀个LayoutManager:

Adapter:继承⾃RecyclerView.Adapetr类,主要⽤来将数据和布局item进⾏绑定。

LayoutManager:布局管理器,设置每⼀项view在RecyclerView中的位置布局以及控件item view的显

⽰或者隐藏.当View重⽤或者回收的时候,LayoutManger都会向Adapter来请求新的数据来进⾏替换原来数据的内容。这种回收重⽤的机制可以提供性能,避免创建很多的view或

者是频繁的调⽤findViewById⽅法。这种机制和ListView还是很相似的。

RecyclerView提供了三种内置的LayoutManager:

1. LinearLayoutManager:线性布局,横向或者纵向滑动列表

2. GridLayoutManager:表格布局

3. StaggeredGridLayoutManager:流式布局,例如瀑布流效果

当然除了上⾯的三种内部布局之外,我们还可以继承RecyclerView.LayoutManager来实现⼀个⾃定义的LayoutManager。

Animations(动画)效果:

RecyclerView对于Item的添加和删除是默认开启动画的。我们当然也可以通过RecyclerView.ItemAnimator类定制动画,然后通过RecyclerView.setItemAnimator()⽅法来进⾏

使⽤。

RecyclerView相关类:

(三) RecyclerView基本实现

1.导⼊ android-support-v7-recyclerview.jar 包。

下载地址:

2.新建布局,引⼊RecyclerView控件:

1

2

3 android:orientation="vertical"

4 android:layout_width="match_parent"

5 android:layout_height="match_parent">

6

7 8

9

10 android:id="@+id/recyclerView_one"

11 android:layout_width="match_parent"

12 android:layout_height="match_parent"

13 android:scrollbars="vertical"

14 />

15

16

3.在Activity中获取RecyclerView控件然后进⾏设置LayoutManger以及Adapter即可,和ListView的写法有点类似:

1 /**

2 * 当前类注释:RecyclerView使⽤实例测试demo

3 * 项⽬名:FastDev4Android

4 * 包名:com.chinaztt.fda.test

5 */

6 public class RecyclerViewTestActivity extends BaseActivity {

7 private LinearLayout top_bar_linear_back;

8 private TextView top_bar_title;

9 private RecyclerView recyclerView_one;

10 private RecyclerView.Adapter mAdapter;

11 private LinearLayoutManager mLayoutManager;

12 @Override

13 protected void onCreate(BundlesavedInstanceState) {

14 super.onCreate(savedInstanceState);

15 setContentView(R.layout.recyclerview_test_layout);

16 top_bar_linear_back=(LinearLayout)this.findViewById(R.id.top_bar_linear_back);

17 top_bar_linear_back.setOnClickListener(new CustomOnClickListener());

18 top_bar_title=(TextView)this.findViewById(R.id.top_bar_title);

19 top_bar_title.setText("RecyclerView使⽤实例");

20 //开始设置RecyclerView

21 recyclerView_one=(RecyclerView)this.findViewById(R.id.recyclerView_one);

22 //设置固定⼤⼩

23 recyclerView_one.setHasFixedSize(true);

24 //创建线性布局

25 mLayoutManager = newLinearLayoutManager(this);

26 //垂直⽅向

27 mLayoutManager.setOrientation(OrientationHelper.VERTICAL);

28 //给RecyclerView设置布局管理器

29 recyclerView_one.setLayoutManager(mLayoutManager);

30 //创建适配器,并且设置

31 mAdapter = newTestRecyclerAdapter(this);

32 recyclerView_one.setAdapter(mAdapter);

33 }

34 class CustomOnClickListener implements View.OnClickListener{

35 @Override

36 public void onClick(View v) {

37 RecyclerViewTestActivity.this.finish();

38 }

39 }

40 }

4.⾃定义⼀个适配器来进⾏创建item view以及绑定数据:

1 /**

2 * 当前类注释:RecyclerView 数据⾃定义Adapter

3 * 项⽬名:FastDev4Android

4 * 包名:com.chinaztt.fda.adapter.base

5 */

6 public class TestRecyclerAdapter extends RecyclerView.Adapter{

7 private LayoutInflater mInflater;

8 private String[] mTitles=null;

9 public TestRecyclerAdapter(Context context){

10 this.mInflater=LayoutInflater.from(context);

11 this.mTitles=new String[20];

12 for (int i=0;i<20;i++){

13 int index=i+1;

14 mTitles[i]="item"+index;

15 }

16 }

17 /**

18 * item显⽰类型

19 * @param parent

20 * @param viewType

21 * @return

22 */

23 @Override

24 public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

25 Viewview=mInflater.inflate(R.layout.item_recycler_layout,parent,false);

26 //view.setBackgroundColor(Color.RED);

27 ViewHolder viewHolder=new ViewHolder(view);

28 return viewHolder;

29 }

30 /**

31 * 数据的绑定显⽰

32 * @param holder

33 * @param position

34 */

35 @Override

36 public void onBindViewHolder(ViewHolder holder, int position) {

37 holder.item_tv.setText(mTitles[position]);

38 }

39

40 @Override

41 public int getItemCount() {

42 return mTitles.length;