Android新特性-RecyclerView之基础篇
16lz
2021-01-26
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,需要我们进一步取封装和完善。
更多相关文章
- Android(安卓)异步任务 设置 超时使用handler更新通知功能
- Android黑群出品:SQLite数据库的使用和升级
- Android本地存储——SQLite数据库
- Android(安卓)Studio提高效率插件---adb idea
- Android中用onSaveInstanceState保存Fragment状态的方法
- Android记事本项目开发
- android studio基础知识2 -- 设置代理,轻松下载sdk
- Android(安卓)socket通信 真机io错误 模拟器正常的原因
- android 铃声设置流程讲解