Android新特性-RecyclerView之基础篇

转载请注明出处chendong_

RecyclerView位于v7包下,Gradle模式下在Build.gradle文件中添加

compile'com.android.support:recyclerview-v7:22.2.0'

RecycerView是类似于ListView和GridView的控件,可以使用列表的形式展示数据,同时也很好的支持了瀑布流的模式,但是他根本上是继承自ViewGroup的

public class RecyclerView extends ViewGroup implements ScrollingView, NestedScrollingChild

1.在xml文件中使用比较简单,甚至感觉不出与ListView的感觉。

 <android.support.v7.widget.RecyclerView  android:layout_width="match_parent" android:layout_height="match_parent" />

2.在代码中设置LayoutManager,需要在设置adapter之前设置LayoutManager

RecyclerView.LayoutManager layoutManager = null;//线性布局,第二个参数支持水平垂直两种方向,第三个参数用来设置是否反向显示layoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);//网格布局,第二个参数设置列数,第三个参数支持水平垂直两种方向,第四个参数用来设置是否反向显示layoutManager = new GridLayoutManager(this,3,GridLayoutManager.HORIZONTAL,false);//瀑布流布局,第一个参数设置列数,第二个参数支持水平垂直两种方向 layoutManager = new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL);recyclerView.setLayoutManager(layoutManager);

3.继承Recycler.ViewHolder实现自定义ViewHolder

//这里只是实现简单的功能,旨在介绍了解RecyclerView的使用。//需要注意的一点是,RecyclerView并没有实现OnItemClickListener事件,也就是我们无法直接获得Item的点击事件。//采用的方法是在最外层的父布局添加点击事件来模拟Item点击。//getAdapterPosition();函数获取当前Item在Adapter中的位置//getLayoutPosition());函数获得当前Item在布局中的位置class CustomViewHolder extends RecyclerView.ViewHolder {        TextView tv;        public CustomViewHolder (View itemView) {            super(itemView);            tv = (TextView) itemView.findViewById(R.id.test_tv);            itemView.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Log.i("chendong", "点击了item" + getAdapterPosition() + " layout --"+getLayoutPosition());                }            });        }    }

4.继承Recycler.Adapter实现适配器

class ContentAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {        public ContentAdapter() {        //在这里获得需要的参数        }        @Override        public int getItemViewType(int position) {         //获取数据的类型,用于多类型适配        }        @Override        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        //获取对应类型的ViewHolder,加载不同的布局,类似ListView中getView()的代码,示例代码:        View view = getLayoutInflater().inflate(R.layout.test, parent, false);        return new CustomViewHolder(view);        }        @Override        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {        //向ViewHolder中的控件绑定数据,这里用的是强转,也可以使用泛型直接生成CustomViewHolder,但是多类型适配时还是需要强转。        CustomViewHolder temp = (CustomViewHolder)holder;        holder.tv.setText("a");        }        @Override        public int getItemCount() {        //获取Item个数            return 0;        }    }

5.数据更新

//类似ListView的数据更新,但是开放了更多方法,由于RecyclerView继承自ViewGroup,可以轻松实现对其中每一个控件的操作,而不用更新整个列表。//舒心列表adapter.notifyDataSetChanged();//删除某一位置的Itemadapter.notifyItemRemoved(0);//修改某一位置的Itemadapter.notifyItemChanged(0);//向某一位置掺入Itemadapter.notifyItemInserted(0);//将pos1的Item移动到pos2adapter.notifyItemMoved(0,1);//通知部分Item改变adapter.notifyItemRangeChanged(0,4);//向0-4的位置插入数据adapter.notifyItemRangeInserted(0,4);//移除0-4的数据adapter.notifyItemRangeRemoved(0,4);

6.更多

RecyclerView提供了插入分隔线的方法,但是是个抽象类,需要我们自己重写,并且没有实现好的默认分隔线。

recyclerView.addItemDecoration(new RecyclerView.ItemDecoration() {//onDraw方法先于绘制Item            @Override            public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {                super.onDraw(c, parent, state);            }//onDrawOver在绘制Item之后,一般我们选择复写其中一个即可。            @Override            public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {                super.onDrawOver(c, parent, state);            }//getItemOffsets 可以通过outRect.set()为每个Item设置一定的偏移量,主要用于绘制            @Override            public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {                super.getItemOffsets(outRect, view, parent, state);            }        });

RecyclerView为数据的更新增加了动画效果,并且提供了一个默认的动画,我们可以通过实现ItemAnimator实现自己的动画效果。

recyclerView.setItemAnimator(new DefaultItemAnimator());

RecyclerView采用插拔式的数据填充,提供了更加强大的显示效果,可以轻松实现,各个方向的ListView,GridView,瀑布流效果,简单方便。但在进行多类型分类适配时需要创建大量的ViewHolder,需要我们进一步取封装和完善。

更多相关文章

  1. Android(安卓)异步任务 设置 超时使用handler更新通知功能
  2. Android黑群出品:SQLite数据库的使用和升级
  3. Android本地存储——SQLite数据库
  4. Android(安卓)Studio提高效率插件---adb idea
  5. Android中用onSaveInstanceState保存Fragment状态的方法
  6. Android记事本项目开发
  7. android studio基础知识2 -- 设置代理,轻松下载sdk
  8. Android(安卓)socket通信 真机io错误 模拟器正常的原因
  9. android 铃声设置流程讲解

随机推荐

  1. Android(安卓)P 以及之后版本不支持同时
  2. Android(安卓)4.0: 旋转屏幕时禁止Activi
  3. 使用本地仓库实现最新版ReactNative集成A
  4. Binder 简介
  5. Android(安卓)系统分区分析
  6. Android(安卓)SDK代理服务器解决国内不能
  7. Android(安卓)中如何关闭线程
  8. Bitmap和Drawable相互转换方法
  9. react native android
  10. Android(安卓)菜单(Menu)控件的使用