使用RecyclerView
2016-07-13 22:32
501 查看
RecyclerView是一种新的
ViewGroup用来生成基于适配器的view的方式,可以看作是
ListView和
GridView的方式,优势在于RecyclerView拥有更加可扩展的矿建,而且提供了生成水平和垂直布局的能力。当你的数据集合动态的根据用户的动作或者网络事件而改变时推荐使用。
-
RecyclerView.Adapter:处理数据集合并且将数据绑定到视图上
-
LayoutManager帮助定位项的位置
-
ItemAnimator对于常见的操作比如添加删除进行动画化
此外,它还提供对于ListView中项的动画的支持,而且支持
ViewHolder模式,这一模式已经被整合到新的框架中了。
和ListView的比较
对于适配器中ViewHolder的要求:ListView的适配器不要求使用ViewHolder提高表现,而相反,实现RecyclerView的适配器需要使用ViewHolder模式。自定义item布局 : ListView只支持竖直的项布局而且不能自定义,而RecyclerView.Manager允许各式的布局包括水平列表或者交错的网格
简单的动画 : ListView对于项的动画没有特别的规定,而RecyclerView有RecyclerView.ItemAnimator类用来处理项的动画
数据源处理 : ListView对于不同的数据源有不同的适配器例如
ArrayAdapter和
CursorAdapter分别对应数组和数据库。而RecyclerView要求自定义实现将数据提供给适配器。
项的摆放 : ListView有
android:divider属性简单的将列表中的项分离开,而RecyclerView有RecyclerView.ItemDecoration对象进行手动的分离的设置
手动检测点击 : ListVIiew有AdapterView.OnItemClickListener接口将点击事件绑定到列表中的项上面。而后者只支持RecyclerView.OnItemTouchListener管理单独的点击事件,但是没有内置的点击处理。
RecyclerView
的组件
LayoutManagers
RecyclerView需要布局管理器和适配器的对象,布局管理器负责将视图放置在RecyclerView中,并且决定何时重新使用对于用户不可见的视图。内置的布局管理器:
-
LinearLayoutManager在水平或者竖直的列表中展示项
-
GridLayoutManager将项展示在网格中
-
StagegeredGridLayoutManager在格栅视图中展示
为了创建自定义的管理器需要继承
RecyclerView.LayoutManager类
LinearLayoutManager manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
GridLayoutManager manager = new GridLayoutManager(this, 2, GridLayoutManager.VERTICAL, false);//有俩列columns manager,setSpanSizeLookup( new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { //每隔一行合并两列 return (position % 3 == 0 ? 2 : 1); } });
//交错的窗格 StaggeredGridLayoutManager manager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL); //不对缝隙做处理 manager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_NONE);
RecyclerView.Adapter
包含了一种新的适配器,与我们之前使用的有些相似,但也有其独特性,例如要求ViewHolder,我们需要重写两个主要方法:一个是加载view和ViewHolder,另外一个是将数据绑定到视图上,好的地方在于对于第一种方法我们只在需要创建新的view时候调用,不用检查是否用于了循环。
ItemAnimator
RecyclerView.ItemAnimator将会对
ViewGroup的修改进行动画化,并通知到适配器。
DefaultItemAnimator可以用于基本的动画化而且不错。
使用RecyclerView
加RecyclerView的支持
定义模块类来使用数据源
在活动中加入
RecyclerView展示项
创建一个自定义的行布局文件并进行加载
创建
RecyclerView.Adapter和
ViewHolder生成项
在adapter上绑定数据源来填充
RecyclerView
配置
dependencies { compile 'com.android.support:recyclerview-v7:23.4.0' }
定义一个模块
我们定义一个联系人类public class Contact { private String mName; private boolean mOnline; public Contact(String name, boolean online) { mName = name; mOnline = online; } public String getName() { return mName; } public boolean isOnline() { return mOnline; } private static int lastContactId = 0; //获得一个用户的列表数组 public static ArrayList<Contact> createContactList(int numContacts) { ArrayList<Contact> contacts = new ArrayList<Contact>(); for (int i = 1; i <= numContacts; i++) { contacts.add(new Contact("person" + ++lastContactId, i <= numContacts / 2)); } return contacts; } }
布局中创建RecyclerView
<android.support.v7.widget.RecyclerView android:id="@+id/rvContacts" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v7.widget.RecyclerView>
自定义项的布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingTop="10dp" android:paddingBottom="10dp" > <TextView android:id="@+id/contact_name" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" /> <Button android:id="@+id/message_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingLeft="16dp" android:paddingRight="16dp" android:textSize="10sp" /> </LinearLayout>
创建适配器
作用是将某一位置的对象转换成表中的一项插入。viewHolder对象作用是描述和提供对于每一行的视图的访问权限的
public class ContactsAdapter extends RecyclerView.Adapter<ContactsAdapter.ViewHolder> { //对每一项中的views进行直接的引用 //用来缓存每一项不布局中的views 以便快速访问 public static class ViewHolder extends RecyclerView.ViewHolder { //holder对象应该包含每一项中视图的成员变量 public TextView nameTextView; public Button messageButton; //构造方法接受每一项的布局作为参数,存储成员变量以便于访问 public ViewHolder(View itemView) { super(itemView); nameTextView = (TextView) itemView.findViewById(R.id.contact_name); messageButton = (Button) itemView.findViewById(R.id.message_button); } } //首先创建一个存储联系人的成员变量 private List<Contact> mContacts; //存储context变量 private Context mContext; //传递联系人数组到构造方法中和 public ContactsAdapter(Context context, List<Contact> contacts) { mContacts = contacts; mContext = context; } //为了方便的访问Context变量 public Context getmContext() { return mContext; } //加载item布局并且创造holder对象 @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { Context context = parent.getContext(); LayoutInflater inflater = LayoutInflater.from(context); //加载自定义布局 View contactView = inflater.inflate(R.layout.item_contact, parent, false); //返回一个holder实例 ViewHolder viewHolder = new ViewHolder(contactView); return viewHolder; } //通过holder将数据填充进项 @Override public void onBindViewHolder(ViewHolder holder, int position) { //得到数据的对象 Contact contact = mContacts.get(position); //设置itemView的内容 TextView textView = holder.nameTextView; textView.setText(contact.getName()); Button button = holder.messageButton; button.setText("Message"); } //返回项的数量 @Override public int getItemCount() { return mContacts.size(); } }
将适配器绑定到RecyclerView上
public class MainActivity extends AppCompatActivity { ArrayList<Contact> contacts; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); RecyclerView rvContacts = (RecyclerView) findViewById(R.id.rvContacts); //初始化联系人列表 contacts = Contact.createContactList(20); //创建适配器 ContactsAdapter adapter = new ContactsAdapter(this, contacts); //绑定适配器 rvContacts.setAdapter(adapter); //设置布局g管理器 rvContacts.setLayoutManager(new LinearLayoutManager(this)); } }
我们向增加数据需要将新增的数据加入到现有列表中并且对适配器进行通知,通知相关的方法
单独增加一个数据时
// Add a new contact contacts.add(0, new Contact("Barney", true)); // Notify the adapter that an item was inserted at position 0 adapter.notifyItemInserted(0);
添加一个列表
//现有项数 int curSize = adapter.getItemCount(); //添加项 contacts.addAll(Contact.createContactList(1)); adapter.notifyItemRangeChanged(curSize, contacts.size());
滑动向某一位置:recyclerView.scrollToPosition(0);
在底部增加项时通知适配器滑动到相应位置:
adapter.notifyItemInserted(contacts.size() - 1); // contacts.size() - 1 is the last element position rvContacts.scrollToPosition(mAdapter.getItemCount() - 1); // update based on adapter
配置RecyclerView
外观:针对每项是否为同一高度进行优化:recyclerView.setHasFixedSize(true);
布局:我们可以设置项的布局为网格布局或者线性布局,并且设置各种属性
// Setup layout manager for items LinearLayoutManager layoutManager = new LinearLayoutManager(this); // Control orientation of the items // also supports LinearLayoutManager.HORIZONTAL layoutManager.setOrientation(LinearLayoutManager.VERTICAL); // Optionally customize the position you want to default scroll to layoutManager.scrollToPosition(0); // Attach layout manager to the RecyclerView recyclerView.setLayoutManager(layoutManager);
// First param is number of columns and second param is orientation i.e Vertical or Horizontal StaggeredGridLayoutManager gridLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL); // Attach the layout manager to the recycler view recyclerView.setLayoutManager(gridLayoutManager);
装饰:可以用来在网格布局或者交错布局中进行设置项与项之间的间距通过对RecyclerView.ItemDecoration进行设置。
public class SpacesItemDecoration extends RecyclerView.ItemDecoration { private final int mSpace; public SpacesItemDecoration(int space) { this.mSpace = space; } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { outRect.left = mSpace; outRect.right = mSpace; outRect.bottom = mSpace; // Add top margin only for the first item to avoid double space between items if (parent.getChildAdapterPosition(view) == 0) outRect.top = mSpace; } }
使用:
SpacesItemDecoration decoration = new SpacesItemDecoration(16);
mRecyclerView.addItemDecoration(decoration);
4. 动画:本身支持进入,移动和删除的动画相关类为
ItemAnimaor自动的动画效郭由
DefaultItemAnimator,目前最快的动画实现方式为使用第三方库
recyclerview-animators library网址为https://github.com/wasabeef/recyclerview-animators
//If you are using a RecyclerView 23.1.0 (released Oct 2015) or higher. dependencies { // jCenter compile 'jp.wasabeef:recyclerview-animators:2.2.3' } //If you are using a RecyclerView 23.0.1 or below. dependencies { // jCenter compile 'jp.wasabeef:recyclerview-animators:1.3.0' }
简单使用:
recyclerView.setItemAnimator(new SlideInUpAnimator());
后续还包括对于点击事件的处理。。。http://guides.codepath.com/android/Using-the-RecyclerView
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories