RecyclerView 是Android一个更强大的控件,其不仅可以实现和ListView同样的效果,还有优化了ListView中的各种不足。其可以实现数据纵向滚动,也可以实现横向滚动(ListView做不到横向滚动)。接下来讲解RecyclerView的用法。
因为 RecyclerView 属于新增的控件,Android将RecyclerView定义在support库里。若要使用RecyclerView,第一步是要在 build.gradle 中添加对应的依赖库。
在 app/build.gradle 中的 dependencies闭包 添加以下内容:
然后点击顶部的Sync Now进行同步
由于 RecyclerView 不是内置在系统SDK中,需要把其完整的包名路径写出来
创建ImageView来显示水果图片,TextView来显示水果名字。
为 RecyclerView 新增适配器 FruitAdapter ,并让其继承于 RecyclerView.Adapter ,把泛型指定为 FruitAdapter.ViewHolder 。
LayoutManager 用于指定RecyclerView的布局方式。 LinearLayoutManager 指的是线性布局。
运行效果:
把LinearLayout改成垂直排列,因为水果名字长度不一样,把宽度改为100dp。
ImageView和TextView都改为水平居中
通过调用 setOrientation() 把布局的排列方向改为水平排列。
得益于RecyclerView的设计,我们可以通过LayoutManager实现各种不同的排列方式的布局。
运行结果:
除了 LinearLayoutManager , RecyclerView 还提供了 GridLayoutManager(网格布局) 和 StaggeredGridLayoutManager(瀑布流布局)
GridLayoutManager(网格布局)
修改 MainActivity.java ,把
换成
GridLayoutManager (Context context, int spanCount)
运行结果:
StaggeredGridLayoutManager(瀑布流布局)
把LinearLayout的宽度设为 match_parent 是因为瀑布流的宽度是 根据布局的列数来自动适配的,而不是固定值 。(GridLayoutManager也是 根据布局的列数来自动适配的 )
StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL)
StaggeredGridLayoutManager传入2个参数,第一个是布局的列数,第二个是布局的排列方向。
random.nextInt(20)+1 产生1-20的随机数
运行效果:
上图是GridLayoutManager,下图是StaggeredGridLayout。
当从显示效果来看,已经一目了然。
GridLayoutManager是会固定高度的,所以会留下很多空白区域。
相反,StaggeredGridLayout并不会固定高度,以至于就算子项的高度不一致,下一行的会自动靠拢上一行。
修改ViewHolder,添加fruitView变量来保存子项最外层布局的实例。
运行效果:
为listview的item设置不同的布局文件,步骤如下1、为不同的item写不同的布局文件,设置统一的bean类
2、继承BaseAdapter类,实现getItemViewType(int position)和getViewTypeCount() 方法,根据这两个方法,为item设置不同的标记,也就是不同的type
/**
* 根据数据源的position返回需要显示的的layout的type
*
* type的值必须从0开始
*/
@Override
public intgetItemViewType(intposition) {
returnposition ==0?0:1
}
3、在getView方法中,利用getItemViewType(position)方法获取当前的type类型,然后根据不同的type类型,加载不同的item布局文件。
intviewType = getItemViewType(position)
ViewTagHolder mViewTagHolder =null
if(convertView ==null) {
if(viewType ==0) {
convertView =mInflater.inflate(R.layout.layout_hot_search,parent, false)
}else{
convertView =mInflater.inflate(R.layout.adapter_tag_item,parent, false)
mViewTagHolder =newViewTagHolder(convertView)
convertView.setTag(R.string.app_name,mViewTagHolder)
}
}else{
mViewTagHolder = (ViewTagHolder) convertView.getTag(R.string.app_name)
}
4、其他的一些listview的优化同一般的listview没有很大区别。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)