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、瀑布流等功能,非常灵活
RecyclerView主要的方法:
  • setLayoutManager设置RecyclerView的布局管理器,默认给我们提供了三种: LinearLayoutManager、GridLayoutManager、StaggeredGridLayoutManager。当然也可以继承LayoutManager来自定义。
  • setItemAnimator  设置item的添加、删除动画效果,默认给我们提供了一种默认动画效果:DefaultItemAnimator。同理也可以我们自己自定义想要的动画效果。
  • addItemDecoration  添加item之间的分隔线,默认没有提供类给我们使用,如果需要使用到分割线则需要我们自定义。
  • setAdapter设置RecyclerView的适配器,这个需要我们自己继承RecyclerView.Adapter来实现。
  • RecyclerView中默认没有提供onItemClick和onItemLongClick点击事件方法,需要我们自己在适配器中写接口来实现。
下面我们通过代码来看看怎么来使用RecyclerView:
一、在gradle中添加jar包依赖:




二、在主布局中使用RecyclerView、定义Item布局:
activity_main.xml
<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>
item.xml
<?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>

三、在代码中使用ToolBar和RecyclerView:
MainActivity.java
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。


四、自定义Adapter。

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的使用(一)的更多相关文章

  1. Material Design UI Widgets

    Android L 开发者预览支持库提供两个新的Widgets,RecyclerView和CardView.使用这两个Widgets可以显示复杂的Listview和卡片布局,这两个Widgets默认使 ...

  2. Android Material Design 兼容库的使用

    Android Material Design 兼容库的使用 mecury 前言:近来学习了Android Material Design 兼容库,为了把这个弄懂,才有了这篇博客,这里先推荐两篇博客: ...

  3. ANDROID L——Material Design详解(UI控件)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! Android L: Google已经确认Android L就是Android Lolli ...

  4. 直接拿来用!十大Material Design开源项目

    来自:http://www.csdn.net/article/2014-11-21/2822753-material-design-libs/1 介于拟物和扁平之间的Material Design自面 ...

  5. Android Material Design简单使用

    吐槽 作为一个 Android developer,没有什么比拿着 UI 设计的一堆 iOS 风格的设计 来做需求更恶心的了,基本所有空间都要照着 iOS 来画一遍,Material Design 辣 ...

  6. Android Material Design之Toolbar与Palette

    转:http://blog.csdn.net/jdsjlzx/article/details/41441083 前言 我们都知道Marterial Design是Google推出的全新UI设计规范,如 ...

  7. Material Design 开发利器:Android Design Support Library 介绍

    转自:https://blog.leancloud.cn/3306/ Android 5.0 Lollipop 是迄今为止最重大的一次发布,很大程度上是因为 material design —— 这是 ...

  8. ANDROID L——Material Design综合应用(Demo)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! Material Design: Material Design是Google推出的一个全 ...

  9. ANDROID L——Material Design详细解释(UI控制)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! Android L: Google已经确认Android L就是Android Lolli ...

随机推荐

  1. MySQL NOW() 函数

    定义和用法 NOW() 返回当前的日期和时间. 语法 NOW() 实例 下面是 SELECT 语句: SELECT NOW(),CURDATE(),CURTIME() 结果如下所示: NOW() CU ...

  2. 安卓onTextChanged参数解释及实现EditText字数监听 Editable使用

    原作者部分修改部分 补充部分 补充部分2 补充部分3 补充部分4 Editable 尊重原作者:此篇文章是借鉴原作者地址 的博文 并进行修改和增加补充说明,我只是补充和修改: 我感觉这篇文章经过我的补 ...

  3. python3中替换python2中cmp函数的新函数分析(lt、le、eq、ne、ge、gt)

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/11332589 作者:sushengmiyan 在python2中我们经常会使用cmp函 ...

  4. 安卓高级3 RecyclerView结合SwipeRefreshLayout并添加上拉

    目录结构: 效果图: MainActivity.java package qianfeng.com.pullrecyclerviewdemo; import android.os.Bundle; im ...

  5. Java中常用缓存Cache机制的实现

    缓存,就是将程序或系统经常要调用的对象存在内存中,一遍其使用时可以快速调用,不必再去创建新的重复的实例. 这样做可以减少系统开销,提高系统效率. 缓存主要可分为二大类: 一.通过文件缓存,顾名思义文件 ...

  6. linux下内存的统计和内存泄露类问题的定位

    在产品的开发中,通过对当前系统消耗内存总量的统计,可以对产品所需内存总量进行精确的评估,从而选择合适的内存芯片与大小,降低产品的成本.在遇到内存泄露类问题时,经常会对此束手无策,本文通过对proc下进 ...

  7. android 自定义ViewGroup之浪漫求婚

    *本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 1.最终效果 有木有发现还是很小清新的感觉 2.看整体效果这是一个scrollView,滑动时每个子view都有一个或多个动画效果 ...

  8. Swift3中方法可变参数语法的一些改变

    我们知道在Swift2中,默认情况下方法的参数是let值,也就是不可改变的. 不过我们可以在参数前添加var关键字改变其不变性: func foo(var i:Int){ i += 1 print(i ...

  9. OpenCV+python 人脸识别

    首先给大家推荐一本书:机器学习算法原理与编程实践 本文内容全部转载于书中,相当于一个读书笔记了吧 绪论 1992年麻省理工学院通过实验对比了基于结构特征的方法与基于模版匹配的方法,发现模版匹配的方法要 ...

  10. 详解EBS接口开发之供应商导入(补充)--错误信息处理

    check reject details on records of AP_SUPPLIER_INT SELECT s.parent_table,s.reject_lookup_code,S.LAST ...