android RecyclerView的基本介绍及用法(一)
2015-10-22 18:31
676 查看
本篇介绍一个更好用更强大的滑动组件 – RecyclerView。
简介:
RecyclerView 是 android-support-v7 包中的控件,它的功能效果类似ListView,其特点有:
RecyclerView 的Item可以回收复用,当然,这不是一个新功能,ListView中就有此机制。但是ListView的回收等功能是紧密耦合在一起的,而 RecyclerView使方法更灵活,开发者也能自定义各种各样的显示效果。并且 ViewHolder 是直接被封装起来的,我们只要实现自己的 ViewHolder 即可。
和ListView不一样的是,RecyclerView不再负责Item的摆放等显示方面的功能。所有和布局、绘制等方面的工作Google将其拆分成不同的类进行管理,开发者可以自定义各种各样满足定制需求的的功能类。
① RecyclerView.Adapter:托管数据集合,为每个Item创建视图。
②RecyclerView.ViewHolder:承载Item视图的子视图。
③RecyclerView.LayoutManager:负责Item视图的布局。
④RecyclerView.ItemDecoration:为每个Item视图绘制Divider。
⑤RecyclerView.ItemAnimator 添加、删除数据时的动画效果。
RecyclerView 使用布局管理器管理子view的位置,将 layout 抽象成了一个 LayoutManager, 我们可以通过 LayoutManager 来实现不同的布局效果。比如:线性 ListView、横向 ScrollView、GridView、瀑布流等类似效果都可以很容易的实现。
LinearLayoutManager提供了如下几个方法来帮助开发者获取屏幕上的顶部item和底部item:
findFirstVisibleItemPosition()
findFirstCompletelyVisibleItemPosition()
findLastVisibleItemPosition()
findLastCompletelyVisibleItemPosition()
RecyclerView 自带了ItemAnimation,可以设置加载和移除时的动画,方便做出各种动态浏览的效果。提供了默认动画效果:DefaultItemAnimator,当然也可以继承 LayoutManager 自定义动画效果。
为了让动画效果起效,开发者必须通知Adapter数据有改变。RecyclerView.Adapter提供了许多通知方法,例如:
public final void notifyItemInserted(int position)
public final void notifyItemRemoved(int position)
RecyclerView 中没有提供 OnItemClickListener 和 OnItemLongClickListener 的监听事件,需要自己在adapter里面写接口实现。
用法:
基本使用效果图
首先记得添加 v7包 。
直接上代码:
适配器MyRecyclerViewAdapter.java
使用RecyclerView的步骤:
①实例化RecyclerView;
②设置布局管理器LayoutManager;
③可以设置一个或多个ItemDecorations,也可以不设置;
④可以设置ItemAnimator,默认动画DefaultItemAnimator;
⑤设置Adapater适配数据。
主界面MainActivity.java
下面看一下其他效果:
RecyclerView的布局管理器很强大,当然也可以自定义,这些只是简单的介绍。
简介:
RecyclerView 是 android-support-v7 包中的控件,它的功能效果类似ListView,其特点有:
RecyclerView 的Item可以回收复用,当然,这不是一个新功能,ListView中就有此机制。但是ListView的回收等功能是紧密耦合在一起的,而 RecyclerView使方法更灵活,开发者也能自定义各种各样的显示效果。并且 ViewHolder 是直接被封装起来的,我们只要实现自己的 ViewHolder 即可。
和ListView不一样的是,RecyclerView不再负责Item的摆放等显示方面的功能。所有和布局、绘制等方面的工作Google将其拆分成不同的类进行管理,开发者可以自定义各种各样满足定制需求的的功能类。
① RecyclerView.Adapter:托管数据集合,为每个Item创建视图。
②RecyclerView.ViewHolder:承载Item视图的子视图。
③RecyclerView.LayoutManager:负责Item视图的布局。
④RecyclerView.ItemDecoration:为每个Item视图绘制Divider。
⑤RecyclerView.ItemAnimator 添加、删除数据时的动画效果。
RecyclerView 使用布局管理器管理子view的位置,将 layout 抽象成了一个 LayoutManager, 我们可以通过 LayoutManager 来实现不同的布局效果。比如:线性 ListView、横向 ScrollView、GridView、瀑布流等类似效果都可以很容易的实现。
LinearLayoutManager提供了如下几个方法来帮助开发者获取屏幕上的顶部item和底部item:
findFirstVisibleItemPosition()
findFirstCompletelyVisibleItemPosition()
findLastVisibleItemPosition()
findLastCompletelyVisibleItemPosition()
RecyclerView 自带了ItemAnimation,可以设置加载和移除时的动画,方便做出各种动态浏览的效果。提供了默认动画效果:DefaultItemAnimator,当然也可以继承 LayoutManager 自定义动画效果。
为了让动画效果起效,开发者必须通知Adapter数据有改变。RecyclerView.Adapter提供了许多通知方法,例如:
public final void notifyItemInserted(int position)
public final void notifyItemRemoved(int position)
RecyclerView 中没有提供 OnItemClickListener 和 OnItemLongClickListener 的监听事件,需要自己在adapter里面写接口实现。
用法:
基本使用效果图
首先记得添加 v7包 。
直接上代码:
适配器MyRecyclerViewAdapter.java
import android.content.Context; 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.List; /** * Created by jia on 2015/10/16. */ class MyRecyclerViewAdapter extends RecyclerView.Adapter { private Context context; private List<String> list; public MyRecyclerViewAdapter(Context context, List<String> list) { this.context = context; this.list = list; } /** * onCreateViewHolder中负责为Item创建视图 * * @param viewGroup * @param i * @return */ @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { /*初始化填充RecyclerView的item*/ View viewItem = LayoutInflater.from(context).inflate(R.layout.list_item, viewGroup, false); /*返回自定义的ViewHolder*/ MyViewHolder myViewHolder = new MyViewHolder(viewItem); return myViewHolder; } /** * onBindViewHolder负责将数据绑定到Item的视图上。 * * @param viewHolder * @param position */ @Override public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) { /*将接收到的ViewHolder强转成自定义的VIewHolder*/ final MyViewHolder myViewHolder = (MyViewHolder) viewHolder; /*为Item设置数据*/ myViewHolder.getIdView().setText(list.get(position)); myViewHolder.getNameView().setText("name"); } /** * 本方法决定了绘制item的数量 * * @return */ @Override public int getItemCount() { return list.size(); } class MyViewHolder extends RecyclerView.ViewHolder { private TextView idView; private TextView nameView; public MyViewHolder(View itemView) { super(itemView); idView = (TextView) itemView.findViewById(R.id.id); nameView = (TextView) itemView.findViewById(R.id.name); } public TextView getIdView() { return idView; } public TextView getNameView() { return nameView; } } }
使用RecyclerView的步骤:
①实例化RecyclerView;
②设置布局管理器LayoutManager;
③可以设置一个或多个ItemDecorations,也可以不设置;
④可以设置ItemAnimator,默认动画DefaultItemAnimator;
⑤设置Adapater适配数据。
主界面MainActivity.java
package com.practice.jia.recyclerviewblog; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import java.util.ArrayList; import java.util.List; public class MainActivity extends ActionBarActivity { private RecyclerView recyclerView; private MyRecyclerViewAdapter adapter; private List<String> list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); recyclerView = (RecyclerView) findViewById(R.id.recyclerView); initData(); /* * 初始化一个布局管理器,这里是默认的竖直线性,效果如上图所示 * 其实完整写法为: * LinearLayoutManager manager = new LinearLayoutManager(context, orientation, reverseLayout); * 其中三个参数分别表示: * 1.context:上下文 * 2.orientation:布局方向; * LinearLayoutManager.VERTICAL:竖直方向(默认) * LinearLayoutManager.HORIZONTAL:水平方向 * 3.reverseLayout:布局数据是否反向;false:正常(默认);true:反向; * 下边的写法就相当于:new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false); */ LinearLayoutManager manager = new LinearLayoutManager(this); recyclerView.setLayoutManager(manager); adapter = new MyRecyclerViewAdapter(MainActivity.this, list); recyclerView.setAdapter(adapter); } /** * 初始化集合,添加数据 */ private void initData() { list = new ArrayList<>(); for (int i = 0; i < 100; i++) { list.add("id:" + i); } } }
下面看一下其他效果:
/*竖直列表,布局数据不反向,效果类似传统ListView*/ LinearLayoutManager manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false); /*竖直列表,布局数据反向*/ LinearLayoutManager manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, true); /*横向列表,布局数据正常,效果类似横向ScrollView*/ LinearLayoutManager manager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false); /*横向列表,布局数据反向*/ LinearLayoutManager manager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, true);
/* *GridLayoutManager效果相当于Gridview * new GridLayoutManager(context,spanCount, orientation, reverseLayout); * 四个参数分别表示: * 1.context:上下文 * 2.spanCount:列数(横向就是行数),相当于Gridview的numColumns属性 * 3.orientation:布局方向; * LinearLayoutManager.VERTICAL:竖直方向(默认) * LinearLayoutManager.HORIZONTAL:水平方向 * 4.reverseLayout:布局数据是否反向;false:正常(默认);true:反向; */ /*竖直表格列表,3列,布局数据不反向,效果类似传统GridView*/ GridLayoutManager manager = new GridLayoutManager(this, 3, LinearLayoutManager.VERTICAL, false); /*竖直表格列表,3列,布局数据反向*/ GridLayoutManager manager = new GridLayoutManager(this, 3, LinearLayoutManager.VERTICAL, true); /*横向表格列表,3行,布局数据正常*/ GridLayoutManager manager = new GridLayoutManager(this, 3, LinearLayoutManager.HORIZONTAL, false); /*横向表格列表,3行,布局数据反向*/ GridLayoutManager manager = new GridLayoutManager(this, 3, LinearLayoutManager.HORIZONTAL, true);
RecyclerView的布局管理器很强大,当然也可以自定义,这些只是简单的介绍。
相关文章推荐
- 【Android效果集】弹幕效果
- Android: Launching activities
- android 5.0的input init过程
- android原生(Google)下拉刷新SwipeRefreshLayout
- 001.android初级篇之ToolBar
- Android学习笔记-ExpandableListView的使用
- Android 打造风格统一的导航之v7 ToolBar
- Android四大组件之BroadCastReceiver
- Android 如何加载巨图?
- Android APK优化工具Zipalign详解
- 【笔记】Android中Toast的使用技巧
- android:强大的图片下载和缓存库Picasso
- Android SDK在线更新镜像服务器大全
- android百度地图(一)
- Ubuntu 下将VP9移植到Android
- android数据库更新
- Andorid 布局layout_margin和padding分析
- Android - Design Support Library 学习总结
- android事件机制个人理解
- android webview加载html5乱码解决