RecyclerView详解
RecyclerView是support-v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能,但是直接把viewholder的实现封装起来,用户只要实现自己的viewholder就可以了,该组件会自动帮你回收复用每一个item。
它不但变得更精简,也变得更加容易使用,而且更容易组合设计出自己需要的滑动布局。
要使用RecyclerView,请参考 ,其实你也可以只下载一个jar包,添加到自己的libs里就能使用它了,Recycler.jar
使用它的理由:
RecyclerView
is a more advanced and flexible version of ListView
. This widget is a container for large sets of views that can be recycled and scrolled very efficiently. Use the RecyclerView
widget when you have lists with elements that change dynamically.
简单说,它是ListView的进化,为了当你需要动态展示一组数据的时候就会需要它。
当然,如果只是动态展示数据,listview也可以做到,用它替代listview的原因有几个:
·简介中提到的它封装了viewholder的回收复用。
·RecyclerView使用布局管理器管理子view的位置(目前尚只提供了LinearLayoutManager),也就是说你再不用拘泥于ListView的线性展示方式,如果之后提供其他custom LayoutManager的支持,你能够使用复杂的布局来展示一个动态组件。
·自带了ItemAnimation,可以设置加载和移除时的动画,方便做出各种动态浏览的效果。
如果你想简单地入门这个组件,请参考
官方样例:
xml:
<!-- A RecyclerView with some commonly used attributes -->
<android.support.v7.widget.RecyclerView
android:id="@+id/my_recycler_view"
android:scrollbars="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
main code:
public class MyActivity extends Activity {
private RecyclerView mRecyclerView;
private RecyclerView.Adapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_activity);
mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
// improve performance if you know that changes in content
// do not change the size of the RecyclerView
mRecyclerView.setHasFixedSize(true);
// use a linear layout manager
mLayoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(mLayoutManager);
// specify an adapter (see also next example)
mAdapter = new MyAdapter(myDataset);
mRecyclerView.setAdapter(mAdapter);
}
...
}
adapter code:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private String[] mDataset;
// Provide a reference to the type of views that you are using
// (custom viewholder)
public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView mTextView;
public ViewHolder(TextView v) {
super(v);
mTextView = v;
}
}
// Provide a suitable constructor (depends on the kind of dataset)
public MyAdapter(String[] myDataset) {
mDataset = myDataset;
}
// Create new views (invoked by the layout manager)
@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
// create a new view
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.my_text_view, parent, false);
// set the view's size, margins, paddings and layout parameters
...
ViewHolder vh = new ViewHolder(v);
return vh;
}
// Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
// - get element from your dataset at this position
// - replace the contents of the view with that element
holder.mTextView.setText(mDataset[position]);
}
// Return the size of your dataset (invoked by the layout manager)
@Override
public int getItemCount() {
return mDataset.length;
}
}
替用Gallery:
笔者使用RecyclerView的原因其实并不是为了使用一个新颖的组件去实现华丽的功能,就在前一天我还在到处寻找一个可以替代deprecated组件Gallery的组件。在android滑动组件嵌套一般思路,多任务手势思路,触摸传递思路,【例】listview嵌套viewpager 中我介绍了ListView嵌套ViewPager显示图片的办法。其实在Gallery弃用之后,RecyclerView出来之前,ViewPager和扩展ScrollView是StackOverFlow上推荐的实现Gallery的两种解决办法,但是都有一定的问题,ScrollView要实现Gallery的改动太大,ViewPager替用的滑动体验和原来的Gallery相去甚远。
顺着官方demo,我替换掉原来的ViewPager类,使用RecylcerView,改进有以下几点:
·使用过ViewPager动画的应该知道(有经典的ViewPager动画第三方扩展JazzyViewPager),这些动画是为了提供给每个item占据全屏,或占据几乎全屏这种情况设计的。也就是说,如果你简单地将ViewPager的每页显示数设置为你需要的值,之后设置的动画很可能并不是你需要的效果(因此之前我在嵌套时去掉了ViewPager的动画,稍微有点失望)。
·滑动速度加快,因为ViewPager并不是ViewsPager。。。一次长距离的滑动可能只造成1~2张图片的滚动,一点也不像gallery,这是我用RecylcerView替代它的主要原因。
基于原来的代码,我构建了MyRecyclerGallery,保留了原来的触摸事件,现在滑动起来舒服多了:
你可以看到滑动时还有滚动条。
事件机制和原来一样,RecyclerView的关键代码没有变化,所以就不放出源码了。
- HDUOJ----(1084)What Is Your Grade?
- HDUOJ------(1272)小希的迷宫
- HDUOJ ---1269迷宫城堡
- HDUOJ---1213How Many Tables
- hduoj----(1033)Edge
- HDUOJ----(1031)Design T-Shirt
- HDUOJ----(1030)Delta-wave
- 身份切换脚本,免登入切换权限的利器
- HDUOJ---What Are You Talking About
- HDUOJ-----(1251)统计难题
- HDUOJ-----1541 Stars
- HDUOJ--------(1198)Farm Irrigation
- NYOJ-------三角形
- HDUOJ-------(1022)Train Problem I
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- NHibernate 代码映射实体类
- 使用 Castle Windsor 实现 Web API 依赖注入
- SparkSQL与Hive metastore Parquet转换
- Spark中广播变量详解以及如何动态更新广播变量
- 按需加载 AngularJS 的 Controller
- Spark SQL中Not in Subquery为何低效以及如何规避
- 踩坑记 | Flutter升级影响了NestedScrollView?
- 使用 RequireJS 加载 AngularJS
- 通过Spark生成HFile,并以BulkLoad方式将数据导入到HBase
- 使用 C 创建 Windows 服务
- AngularJS 中的 controllerAs
- Android-Jetpack笔记-DataBinding
- Android-Jetpack笔记-Lifecycles
- Android-Jetpack笔记-LiveData
- Android-Jetpack笔记-ViewModelSavedState