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:
第一个参数传上下文,第二个参数代表线的朝向
它默认是一条白线:我们可以自定义分割线
自定义的方法:在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();