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();