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 ...
随机推荐
- admin的配置
当我们访问http://127.0.0.1:8080/admin/时,会出现: 执行命令: 生成同步数据库的脚本:python manage.py makemigrations ...
- activiti源码分析
http://blog.csdn.net/vote/candidate.html?username=qq_30739519 欢迎大家投票吧谢谢
- jQuery中$(function()与(function($)等的区别详细讲解
(function($) {-})(jQuery); 这里实际上是匿名函数,如下: function(arg){-} 这就定义了一个匿名函数,参数为arg 而调用函数时,是在函数后面写上括号和实参的, ...
- Android存储之SQLite数据库
Android存储之SQLite数据库数据库 创建数据库 package --; import android.content.Context; import android.database.sql ...
- 如何使用Live CD来修复Grub / Grub2
Introduction 一般我会在计算机上装两个或者多个系统,例如,我在计算机上安装了Ubuntu.Windows 7.Windows 8.1.有一天我的Win8.1不能正常使用了,我想重新安装Wi ...
- [CSDN_Markdown] 使用CSDN Markdown编辑器
简介 最近CSDN支持Markdown语法写博客了,甚是欢喜.前几天写了一篇实验了下,感觉不错.准备写几篇文章介绍一下如何使用CSDN的Markdown编辑器写博客,不求全面,但求够用,望大家批评指正 ...
- 有无序的实数列V[N],要求求里面大小相邻的实数的差的最大值,关键是要求线性空间和线性时间。
int findMaxDifBt2Nums(int* arr, int len) { int maxItem = arr[0], minItem = arr[0]; for (int i = 1; i ...
- iOS10软件崩溃 Xcode8崩溃 打印/字体等问题汇总 韩俊强的博客
每日更新关注:http://weibo.com/hanjunqiang 新浪微博!iOS开发者交流QQ群: 446310206 [1].Xcode8代码出现ubsystem: com.apple.U ...
- golang函数可变参数传递性能问题
几天前纠结了一个蛋疼的问题,在go里面函数式支持可变参数的,譬如...T,go会创建一个slice,用来存放传入的可变参数,那么,如果创建一个slice,例如a,然后以a...这种方式传入,go会不会 ...
- 【一天一道LeetCode】#110. Balanced Binary Tree
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...