RecyclerView相对于ListView的优点:
1、可以使用布局管理器LayoutManager来管理RecyclerView的显示方式:水平、垂直、网络、网格交错布局;
2、自定义item的分割条,实现自定义(不知道是优点还是缺点,见仁见智吧 ( ̄▽ ̄)");
3、可以控制item的添加和删除的动画,非常自由,可以自定义动画,配合具体场景,效果非常棒;
4、可以动态的在指定位置添加和删除某一项,而列表不会回到顶部,动态的update列表数据(非常需要);
5、缺点:就是没有OnItemClickListenter(),需要自己在RecycleView内部自定义列表项的点击事件或则长按事件(按需求自己添加);
6、在Material Design中和CardView(和RecycleView同时出现的新控件)配合使用,显示效果非常突出(现在很多新的主流App都使用了这种结构,后面会有demo展示)。
RecycleView的基本使用步骤:
1、模拟对象和获取对象集合数据(这里只是模拟数据)
- package com.world.hello.recycleview;
-
-
-
-
-
- public class SampleModel {
- private String message;
-
- public SampleModel(String message) {
- this.message = message;
- }
-
- public void setMessage(String s) {
- message = s;
- }
-
- public String getMessage() {
- return message;
- }
- }
- package com.world.hello.recycleview;
-
- import java.util.ArrayList;
-
-
-
-
-
- public class DemoApp {
-
- public static ArrayList<SampleModel> getSampleData(int size) {
- ArrayList<SampleModel> sampleData = new ArrayList<SampleModel>(size);
- for (int i = 0; i < size; i++) {
- sampleData.add(new SampleModel("新的列表项 " + i));
- }
-
- return sampleData;
- }
- }
2、绘制列表项之间的分割条
使用RecyclerView控件通常需要指定列表项的分割条。定制分割条的原理是编写一个RecyclerView.ItemDecoration的子类,并实现onDrawOver方法,在该方法中需要绘制所有列表项之间的分割条。如下所示:
- package com.world.hello.recycleview;
-
- import android.content.Context;
- import android.content.res.TypedArray;
- import android.graphics.Canvas;
- import android.graphics.drawable.Drawable;
- import android.support.v7.widget.RecyclerView;
- import android.view.View;
-
-
-
-
-
- public class SampleDivider extends RecyclerView.ItemDecoration {
-
- private static final int[] ATTRS = {android.R.attr.listDivider};
-
- private Drawable mDicider;
-
- public SampleDivider(Context context) {
- TypedArray ta = context.obtainStyledAttributes(ATTRS);
-
- mDicider = ta.getDrawable(0);
-
- ta.recycle();
-
- }
-
-
-
-
-
-
-
- @Override
- public void onDrawOver(Canvas c, RecyclerView parent) {
-
-
- int left = parent.getPaddingLeft();
-
- int right = parent.getWidth() - parent.getPaddingRight();
-
- int childCount = parent.getChildCount();
-
- for (int i = 0; i < childCount; i++) {
-
- View child = parent.getChildAt(i);
-
- RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
-
- int top = child.getBottom() + params.bottomMargin;
-
- int bottom = top + mDicider.getIntrinsicHeight();
-
- mDicider.setBounds(left,top,right,bottom);
-
- mDicider.draw(c);
- }
- }
- }
3、实现Adapter类
就像ListView的adapter一般会继承BaseAdapter一样,RecyclerView也提供了这样的一个基类RecyclerView.Adapter,改基类支持泛型,泛型用于指定列表项中控件。如下:
- package com.world.hello.recycleview;
-
- import android.support.v7.widget.RecyclerView;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.TextView;
-
- import java.util.ArrayList;
- import java.util.Random;
-
-
-
-
-
- public class SampleRecycleAdapter extends RecyclerView.Adapter<SampleRecycleAdapter.ViewHolder>{
-
-
- private final ArrayList<SampleModel> sampleData = DemoApp.getSampleData(30);
-
-
- @Override
- public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
-
- View rowView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item,parent,false);
- return new ViewHolder(rowView);
- }
-
-
- @Override
- public void onBindViewHolder(ViewHolder holder, int position) {
-
- SampleModel rowData = sampleData.get(position);
- holder.textViewSample.setText(rowData.getMessage());
- holder.itemView.setTag(rowData);
- }
-
-
- @Override
- public int getItemCount() {
- return sampleData.size();
- }
-
-
- public void removeData(int position){
- sampleData.remove(position);
-
- notifyItemRemoved(position);
- }
-
-
- public void addItem(int position){
-
- sampleData.add(position,new SampleModel("新增列表项"+ new Random().nextInt(100)));
- notifyItemInserted(position);
- }
-
-
-
-
- public static class ViewHolder extends RecyclerView.ViewHolder{
-
- private TextView textViewSample;
-
- public ViewHolder(View itemView) {
- super(itemView);
- textViewSample = (TextView) itemView.findViewById(R.id.text_view);
- }
- }
注意:SampleRecyclerAdapter类中所有使用@Override的方法都是覆盖的父类的同名方法。这些方法中和ListView对应的Adapter中的方法有些不同,在新Adapter中没有了getView()方法,而是使用onCreateViewHolder和OnBindViewHolder方法。前者用于获取列表项控件,后者用于指定在控件中显示的数据。 还有就是以前数据发生变化时,只能调用notifyDataSetChanged()方法通知数据是否发生变化,现在可以使用notifyItemRemoved()方法告诉具体哪个位置的数据被移除,使用notifyItemInserted()方法通知某一个新的列表项背添加。还有很多新的Api非常实用,如下面图片,就不一一介绍了;
4、在Activity中使用RecyclerView
recycleView是Android Support library中的控件,所以需要在Android studio中的app的gradle中添加下面的依赖
compile 'com.android.support:design:23.4.0'
然后就可以使用RecycleView这个控件了,这里实现了RecycleView的动态添加和删除操作。稍微要比listview复杂点,要设置RecycleView的排列方式 、item间的分割线、item增加和删除的动画;具体使用代码如下:
main_activity.xml文件如下:
- <?xml version="1.0" encoding="utf-8"?>
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- xmlns:app ="http://schemas.android.com/apk/res-auto"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- tools:context="com.world.hello.recycleview.MainActivity">
-
- <Button
- android:id="@+id/delete_btn"
- android:layout_width="match_parent"
- android:layout_height="40dp"
- android:text="删除一项"
- android:background="#4400ffee"
- android:textSize="14dp"/>
-
- <android.support.v7.widget.RecyclerView
- android:id="@+id/recycler_view"
- android:layout_width="match_parent"
- android:layout_height="match_parent"/>
-
- <android.support.design.widget.FloatingActionButton
- android:id="@+id/add_item"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- app:borderWidth="0dp"
- app:rippleColor="#eeff0000"
- android:src="@android:drawable/ic_input_add"
- android:layout_alignParentBottom="true"
- android:layout_alignParentRight="true"
- android:layout_alignParentEnd="true"
- android:layout_marginRight="33dp"
- android:layout_marginEnd="33dp"
- android:layout_marginBottom="38dp" />
-
- </RelativeLayout>
list_item.xml文件如下:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="40dp"
- android:gravity="center_vertical"
- android:orientation="vertical">
-
- <TextView
- android:id="@+id/text_view"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:gravity="center_vertical"
- android:textColor="@android:color/black"
- android:textSize="16sp" />
- </LinearLayout>
效果图如下:
下一篇,将详细讲解。recycleView的排列方法、动画和CardView结合的使用示例