Material Design之RecyclerView的使用(一)
Android 5.0开始就推荐使用Material Design这个设计语言,本文开始就逐一讲解Material
Design中控件的使用。本章主要讲解RecyclerView,期中会带有ToolBar的代码,也是一个Android5.x推荐使用ToolBar替代ActionBar的控件,RecyclerView 是 android-support-v7包中的一个控件,使用该控件时需要添加com.android.support:recyclerview-v7:22.2.0包依赖,该包可在我们下载的sdk目录下D:\Program
Files\Android\sdk\extras\android\support\v7\recyclerview\libs找到。
下面说说使用RecyclerView的优点和能做什么事:
- 提供一种插件式编程,开发者对RecyclerView的设计更加自由
- 强制开发者使用ViewHolder模式,性能更优
- 可以用来实现ListView、GridView、横向ScrollView、瀑布流等功能,非常灵活
- setLayoutManager设置RecyclerView的布局管理器,默认给我们提供了三种: LinearLayoutManager、GridLayoutManager、StaggeredGridLayoutManager。当然也可以继承LayoutManager来自定义。
- setItemAnimator 设置item的添加、删除动画效果,默认给我们提供了一种默认动画效果:DefaultItemAnimator。同理也可以我们自己自定义想要的动画效果。
- addItemDecoration 添加item之间的分隔线,默认没有提供类给我们使用,如果需要使用到分割线则需要我们自定义。
- setAdapter设置RecyclerView的适配器,这个需要我们自己继承RecyclerView.Adapter来实现。
- RecyclerView中默认没有提供onItemClick和onItemLongClick点击事件方法,需要我们自己在适配器中写接口来实现。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?attr/colorPrimary" android:minHeight="?attr/actionBarSize" /> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/toolbar" android:scrollbars="none" /> </RelativeLayout>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:background="@drawable/recyclerview_item" android:layout_margin="10dp" android:orientation="vertical" android:layout_height="72dp"> <TextView android:id="@+id/textView" android:layout_width="match_parent" android:padding="20dp" android:layout_height="72dp" android:textAppearance="?android:attr/textAppearanceLarge" /> </LinearLayout>
public class MainActivity extends AppCompatActivity { private Toolbar mToolbar; private RecyclerView mRecyclerView; private List<String> lists; private MyAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mToolbar = (Toolbar)this.findViewById(R.id.toolbar); setSupportActionBar(mToolbar); initData(); mRecyclerView = (RecyclerView) this.findViewById(R.id.recyclerView); // mRecyclerView.setHasFixedSize(true);//如果可以确定每个item的高度是固定的,设置这个选项可以提高性能 mRecyclerView.setLayoutManager(new LinearLayoutManager(this));//设置RecyclerView的布局管理 // mRecyclerView.addItemDecoration();//设置RecyclerView中item的分割线,用的少,一般都用在item中设置margin分隔两个item mRecyclerView.setItemAnimator(new DefaultItemAnimator());//设置item的添加删除动画,采用默认的动画效果 adapter = new MyAdapter(this,lists); mRecyclerView.setAdapter(adapter);//设置Adapter adapter.setOnItemClickListener(new MyAdapter.OnItemClickListener() {//添加监听器 @Override public void onItemClick(View view, int postion) { Toast.makeText(MainActivity.this,"点击的是:"+postion,Toast.LENGTH_SHORT).show(); } @Override public void onItemLongClick(View view, int postion) { Toast.makeText(MainActivity.this, "长按的是:" + postion, Toast.LENGTH_SHORT).show(); } }); } private void initData(){ lists = new ArrayList<String>(); for (int i = 'A'; i < 'z'; i++) { lists.add(""+(char)i); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); switch (id){ case R.id.action_add: lists.add(1, "add"); // adapter.notifyDataSetChanged();//用这个则可以更新数据,但是没有动画效果 adapter.notifyItemInserted(1);//注意:RecyclerView中添加用notifyItemInserted();才有动画效果 break; case R.id.action_delete: lists.remove(1); adapter.notifyItemRemoved(1);//RecyclerView中删除用notifyItemRemoved();才有动画效果 break; case R.id.action_linear: mRecyclerView.setLayoutManager(new LinearLayoutManager(this));//设置RecyclerView的GridLayoutManager布局管理,默认垂直,还有一个设置水平排列的构造方法 break; case R.id.action_grid: mRecyclerView.setLayoutManager(new GridLayoutManager(this,3));//设置RecyclerView的GridLayoutManager布局管理,默认为垂直 break; case R.id.action_grid_horizontal: mRecyclerView.setLayoutManager(new GridLayoutManager(this,3,GridLayoutManager.HORIZONTAL,false));//设置RecyclerView的GridLayoutManager的水平布局管理,参数分别为context,列数或行数,排列方式,是否反转布局的内容 break; case R.id.action_staggeredgrid: mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL));//设置RecyclerView的StaggeredGridLayoutManager的布局管理,它是GridLayout升级版,可以显示交错式网格布局,参数分别为列数或行数,排列方式 break; } return super.onOptionsItemSelected(item); } }
【注意】:使用ToolBar时,必须在styles.xml中设置当前Activity使用的style风格为NoActionBar。如果想改变状态栏的背景色,则需要在style中定义item,name="colorPrimaryDark",仅支持Android5.x。
MyAdapter.java
/** * 继承RecyclerView的Adapter,它会强制开发者使用ViewHolder模式,所以继承适配器的时候传入的泛型是一个继承自ViewHolder的实现类 * 不过RecyclerView中没有提供给我们Click和onLongClick监听器,需要我们自己实现 */ public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> { private Context context; private List<String> lists; private OnItemClickListener mOnItemClickListener; public interface OnItemClickListener { void onItemClick(View view, int postion); void onItemLongClick(View view, int postion); } public void setOnItemClickListener(OnItemClickListener listener) {//对外提供的一个监听方法 this.mOnItemClickListener = listener; } public MyAdapter(Context context, List<String> lists) { this.context = context; this.lists = lists; } @Override public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {//创建一个ViewHolder View itemView = LayoutInflater.from(context).inflate(R.layout.item, viewGroup, false);//填充这个item布局 MyViewHolder viewHolder = new MyViewHolder(itemView);//创建ViewHolder return viewHolder; } @Override public void onBindViewHolder(final MyViewHolder myViewHolder, int pos) {//绑定ViewHolder myViewHolder.mTextView.setText(lists.get(pos));//为ViewHolder里的控件设置值 if (mOnItemClickListener != null) {//如果设置了监听那么它就不为空,然后回调相应的方法 myViewHolder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int postion = myViewHolder.getLayoutPosition();//得到当前点击item的位置postion mOnItemClickListener.onItemClick(myViewHolder.itemView, postion); } }); myViewHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { int postion = myViewHolder.getLayoutPosition(); mOnItemClickListener.onItemLongClick(myViewHolder.itemView, postion); return true; } }); } } @Override public int getItemCount() { return lists.size(); } } class MyViewHolder extends RecyclerView.ViewHolder { TextView mTextView; public MyViewHolder(View itemView) { super(itemView); mTextView = (TextView) itemView.findViewById(R.id.textView); } }
至此RecyclerView用法就是这些了。其中需要注意的是在RecyclerView中添加和删除item时,要想有动画效果,则需要使用adapter.notifyItemInserted();和adapter.notifyItemRemoved();
源码下载地址:http://download.csdn.net/detail/u010687392/8868487
转载请注明出处:http://blog.csdn.net/u010687392
下一篇将讲用RecyclerView实现瀑布流效果!
Material Design之RecyclerView的使用(一)的更多相关文章
- Material Design UI Widgets
Android L 开发者预览支持库提供两个新的Widgets,RecyclerView和CardView.使用这两个Widgets可以显示复杂的Listview和卡片布局,这两个Widgets默认使 ...
- Android Material Design 兼容库的使用
Android Material Design 兼容库的使用 mecury 前言:近来学习了Android Material Design 兼容库,为了把这个弄懂,才有了这篇博客,这里先推荐两篇博客: ...
- ANDROID L——Material Design详解(UI控件)
转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! Android L: Google已经确认Android L就是Android Lolli ...
- 直接拿来用!十大Material Design开源项目
来自:http://www.csdn.net/article/2014-11-21/2822753-material-design-libs/1 介于拟物和扁平之间的Material Design自面 ...
- Android Material Design简单使用
吐槽 作为一个 Android developer,没有什么比拿着 UI 设计的一堆 iOS 风格的设计 来做需求更恶心的了,基本所有空间都要照着 iOS 来画一遍,Material Design 辣 ...
- Android Material Design之Toolbar与Palette
转:http://blog.csdn.net/jdsjlzx/article/details/41441083 前言 我们都知道Marterial Design是Google推出的全新UI设计规范,如 ...
- Material Design 开发利器:Android Design Support Library 介绍
转自:https://blog.leancloud.cn/3306/ Android 5.0 Lollipop 是迄今为止最重大的一次发布,很大程度上是因为 material design —— 这是 ...
- ANDROID L——Material Design综合应用(Demo)
转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! Material Design: Material Design是Google推出的一个全 ...
- ANDROID L——Material Design详细解释(UI控制)
转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! Android L: Google已经确认Android L就是Android Lolli ...
随机推荐
- PHP 安全 E-mail
PHP E-mail 注入 首先,请看上一章中的 PHP 代码: <html> <body> <?php if (isset($_REQUEST['email'])) / ...
- Canvas实现3D效果-可旋转的立方体
摘要:Canvas画布是一个二维平面,如何展示出3D效果?通过将三维空间中的Z轴抽取出来,将图像的点投影到与Z轴垂直的平面上,在通过旋转等变换效果,我们就能实现3D效果. 一.建立坐标系 1)立方体坐 ...
- 两个activity之间透明过渡效果和经验
来看下效果图: 大致效果解释: 1. 当用户点击登录时logo下滑一定距离 2. 下滑后旋转90时 变化图标 3. 继续旋转90度 4. 然后移动到左上角 透明度渐变到上个activity 最后销毁当 ...
- Dynamics CRM2016 在实体命名时需要注意的事项
在使用web api的过程中遇到个很无语的设置,体现在对实体名的设置上,之前看到accounts以为只是在实体名上加个s,也没往深处看,但真正进入项目实施了问题就来了,city直接变成了cities不 ...
- 在android系统上写C语言程序--开机启动该程序不进入安卓系统
今天要写的这篇博文意义重大,也是网上很少有的,这是在我工作中学会的一项技术,当然,它也是由简单的问题组合而来的.如何在安卓中写C语言程序,调试安卓驱动,测试程序的的一项重要技能,下面我就不说废话了,直 ...
- [ExtJS5学习笔记]第三十三节 sencha extjs 5 grid表格导出excel
使用extjs肯定少不了使用表格控件,用到表格,领导们(一般)还是惯于使用excel看数据,所以用到extjs表格的技术猿们肯定也会有导出表格excel这一个需求,本文主要针对如何在用extjs将gr ...
- Dynamics CRM2016 Web API之Expand related entities & $ref & $count
本篇介绍两个关于1:N关系中通过主实体取关联子实体的api,这两个api会经常被用到而且比原来的odata方式更加方便,之前如果我们要取主实体下所有的关联实体的记录都是通过Retrieve Multi ...
- RxJava(七) 使用debounce操作符 优化app搜索功能
欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/51555203 本文出自:[余志强的博客] 一.抛出问题 现在几乎所有 ...
- SQLite 运算符(http://www.w3cschool.cc/sqlite/sqlite-operators.html)
SQLite 运算符 SQLite 运算符是什么? 运算符是一个保留字或字符,主要用于 SQLite 语句的 WHERE 子句中执行操作,如比较和算术运算. 运算符用于指定 SQLite 语句中的条件 ...
- Android源码浅析(四)——我在Android开发中常用到的adb命令,Linux命令,源码编译命令
Android源码浅析(四)--我在Android开发中常用到的adb命令,Linux命令,源码编译命令 我自己平时开发的时候积累的一些命令,希望对你有所帮助 adb是什么?: adb的全称为Andr ...