Android5.0新特性
RecyclerView它有独立的LayoutManager,可以灵活的控制RecyclerView中items的布局:LinearLayoutManager(垂直布局、水平布局)、
先得到一个布局管理器:
LinearLayoutManager layout=new LinearLayoutManager(this);
可以给它设置朝向与滑动的方向
layout.setOrientation(LinearLayoutManager.HORIZONTAL
)
也可以通过一个三元运算去控制朝向,就不用写死
layout.setOrientation(isHORIZONTAL?LinearLayoutManager.HORIZONTAL:LinearLayoutManager.VERTICAL);
然后将布局设置给recyclerView
recyclerview.setLayoutManager(layout);
GridLayoutManager(网格布局)、
GridLayoutManager layout=new GridLayoutManager(this,3);
第二个参数表示网格的列数
StaggeredGridLayoutManager(瀑布流布局);
StaggeredGridLayoutManager layoutt=new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.HORIZONTAL);
第一个参数表示每一行的显示的个数,
第二个参数表示它布局的方法,以及滑动的方法
动态设置高度
RelativeLayout.LayoutParams Params = ( RelativeLayout.LayoutParams) holder.itemView.getLayoutParams(); Params.height = mHeight.get(position); holder.itemView.setLayoutParams(Params);
以下是RecyclerView中的划线:
由于RecyclerView没有listView默认的item的分割线
所以要自己手动画线:
recyclerview.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST));
画线的工具类DividerItemDecoration:可以自己写,也可以去getHub下载
下载路径:
DividerItemDecoration:
https://gist.github.com/alexfu/0f464fc3742f134ccd1e
第一个参数传上下文,第二个参数代表线的朝向
它默认是一条白线:我们可以自定义分割线
自定义的方法:在drawable目录下写一个shape然后用渐变色<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" > <size android:height="4dp"/> <gradient android:startColor="#ff00cc" android:centerColor="#00ffaa" android:endColor="#00aaff"/> </shape>
怎样在文件中引用这个自定义的布局:在该项目的清单文件中配置系统提供的一个android:listDivider
<item name="android:listDivider">@drawable/recycler_shape</item>
设置点击菜单切换效果
这句话显示菜单栏为3个点,并在左上角
ActionBar actionbar = getSupportActionBar();
1:先写布局如下:
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:context="itheima.com.android50.MainActivity"> <item android:id="@+id/re_list" android:orderInCategory="100" android:title="grid" app:showAsAction="never" /> <item android:id="@+id/re_grid" android:orderInCategory="20" android:title="ListActivity" app:showAsAction="never" /> <item android:id="@+id/re_stagger" android:orderInCategory="10" android:title="StaggeredActivity" app:showAsAction="never" /> <item android:id="@+id/re_add" android:orderInCategory="30" android:title="add" app:showAsAction="never" /> <item android:id="@+id/re_delete" android:orderInCategory="50" android:title="delete" app:showAsAction="never" /> </menu>
App:showAsActio有三个属性
never:不显示在界面上,只让出现在右边的三个点中
always:总是显示在界面上
ifRoom:如果有位置它会显示在标题栏上,不然就出现在右边的三个点中
orderIncategory:这个表示在条目中的显示优先级
数值越大,优先级越低,越后显示
在代码中重写:onCreatOptionsMenu(Menumenu)
和onOptionsItemselected(MenuItemitem)2个方法
onCreatOptionsMenu(Menumenu)的作用:将写好的菜单栏的布局填充进来
getMenuInflater().inflate(R.menu.main, menu);
onOptionsItemselected(MenuItemitem)的作用:
点击菜单栏中的item去做切换:
id=item.getItemId(); switch (id){ case R.id.re_list: recyclerview.setLayoutManager(new LinearLayoutManager(this)); break; case R.id.re_grid: recyclerview.setLayoutManager(new GridLayoutManager(this,3)); break; case R.id.re_stagger: recyclerview.setLayoutManager(new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL)); break; /** * 添加item */ case R.id.re_add: add(1); break; /** * 删除item */ case R.id.re_delete: delete(1); break; } return super.onOptionsItemSelected(item);
RecyclerView标准化了ViewHolder,使用Adapter适配器时,面向ViewHolder而不是单纯的View,直接把ViewHolder的实现封装起来,
所以写viewHolder的时候要在适配器里面写:在viewHolder里面可以进行控件的初始化,以及数据的设置,class MyHolder extends RecyclerView.ViewHolder{ TextView tv; ImageView iv; public MyHolder(final View itemView) { super(itemView); MainActivity.this.itemView= (RelativeLayout) itemView; tv= (TextView) itemView.findViewById(R.id.tv); iv= (ImageView)itemView.findViewById(R.id.iv); } /** * 设置数据的方法 * @param position */ private void setData(int position){ iv.setImageResource(icon[position]); tv.setText(mText[position]); //itemView.setTag(R.id.itemView, position); } }
数据的设置也可以放在onBindViewHolder里面进行设置
设置适配器时继承RecyclerView.ViewHolder
重写getItemCount()和onBindViewHolder(MyHolder holder,intposition)和onCreatViewHolder(ViewGroup parent,intviewType)
第一个方法用于返回数据的长度
第二个方法用于绑定viewHolder
第三个方法用于创建viewHolder
返回值是viewHolder
用户只要实现自己的ViewHolder就可以了,该组件会自动帮你回收并复用每一个item
补充:设置菜单栏时,默认图标是3个点,可以自己去自定义view actionbar.setCustomView(view)
Actionbar.hide()隐藏菜单栏显示的view
由于要对RecycleView的条目进行操作,而RecyclerView没有条目的点击事件,只有setOnClickListener()点击事件:如果我们要删除或添加就拿不到对应的索引,可以通过setTag(),和getTag()去拿到对应的索引
itemView.setTag(R.id.itemView, position);
int pos= (int) itemView.getTag();