RecyclerView的使用——简单例子

什么是RecyclerView

RecyclerView是Android 5.0 materials design中的组件之一,相应的还有CardView、Palette等。我们知道,Listview中的Adapter中可以实现ViewHolder的复用。RecyclerView提供了一个耦合度更低的方式来复用ViewHolder,并且可以轻松的实现ListView、GridView以及瀑布流的效果。RecyclerView支持水平滚动和垂直滚动两种列表,而且还支持Grid格子布局和乱序布局,很爽吧~

RecyclerView的使用Demo

1、如果想要使用RecyclerView该控件,我们首先要导入RecyclerView这个控件,直接在build.gradle文件下添加如下配置:

dependencies {
    compile fileTree(include: [‘*.jar‘], dir: ‘libs‘)
    testCompile ‘junit:junit:4.12‘
    compile ‘com.android.support:appcompat-v7:23.2.0‘
    compile ‘com.android.support:recyclerview-v7:23.2.0‘
    compile ‘com.android.support:cardview-v7:23.2.0‘
    compile ‘com.android.support:palette-v7:23.2.0‘
}

compile ‘com.android.support:cardview-v7:23.2.0’

cardview在Item布局里使用到

compile ‘com.android.support:palette-v7:23.2.0’

在RecyclerAdapter里对图片的颜色提取使用到Palette

2、导入了RecyclerView之后,我们可以在xml文件上添加一个RecyclerView,如下:

<android.support.v7.widget.RecyclerView
    android:id="@+id/demo_recyclerView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

3、通过id获取得RecyclerView的对象,并且设置显示方式和添加删除Item时的动画效果:

mRecyclerView = (RecyclerView) findViewById(R.id.demo_recyclerView);
        // 设置布局显示方式,这里我使用都是垂直方式——LinearLayoutManager.VERTICAL
        mRecyclerView.setLayoutManager(new GridLayoutManager(this, 3));
        // 设置添加删除item的时候的动画效果
        mRecyclerView.setItemAnimator(new DefaultItemAnimator());

setLayoutManager()方法接受一个 LayoutManager 布局管理参数。参数类型可以有以下几种:

LinearLayoutManager:线性布局

GridLayoutManager:网格布局

StaggeredGridLayoutManager:流式布局

那么怎么new一个LayoutManager出来呢?举个例子:

new LinearLayoutManager(this, LinearLayout.VERTICAL, true)

  • 第一个参数 Context
  • 第二个参数:布局方向LinearLayout.VERTICAL垂直和LinearLayout.HORIZONTAL水平
  • 第三个参数:表示是否从最后的Item数据开始显示,ture表示是,false就是正常显示—从开头显示。

4、RecyclerView是一个容器控件,那么数据内容用什么来封装和操作呢?

1)先准备一个bean类,代表一个item的内容,在这里以一张图(图的id表示)和文字为例:

public class Item {

    private String title;
    private int resId;

    public Item(String title, int resId) {
        this.title = title;
        this.resId = resId;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getTitle() {
        return title;
    }

    public void setResId(int resId) {
        this.resId = resId;
    }

    public int getResId() {
        return resId;
    }
}

2)Item也需要显示的布局xml,对应的:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card="http://schemas.android.com/apk/res-auto"
    android:layout_width="160dp"
    android:layout_height="200dp"
    android:layout_gravity="center"
    card:cardBackgroundColor="@android:color/white"
    card:cardCornerRadius="5dp"
    card:cardElevation="2dp"
    card:cardMaxElevation="@dimen/cardview_default_elevation">
    <!--cardMaxElevation:最大卡片阴影的宽度-->
    <!--cardElevation:卡片阴影的宽度-->
    <!--cardBackgroundColor:卡片的背景颜色-->
    <!--cardCornerRadius :卡片的圆角半径-->

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <ImageView
            android:id="@+id/item_image"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_centerInParent="true"
            android:layout_weight="3"
            android:scaleType="fitXY" />

        <TextView
            android:id="@+id/item_title"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:clickable="true"
            android:gravity="center"
            android:padding="5dp"
            android:textColor="@android:color/black"
            android:textSize="16sp" />
    </LinearLayout>

</android.support.v7.widget.CardView>

3)用RecyclerAdapter来操作数据内容,给RecyclerView使用:

import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.v7.graphics.Palette;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.List;

/**
 * Created by Administrator on 2016/5/6 0006.
 */
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.MyViewHolder> {

    private Context context;
    private List<Item> itemList;
    private Resources resources;
    private LayoutInflater inflater;

    public RecyclerAdapter(Context context, List<Item> itemList) {
        this.context = context;
        this.itemList = itemList;
        this.resources = context.getResources();
        inflater = LayoutInflater.from(context);
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = inflater.inflate(R.layout.item_recyclerview, parent, false);
        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(final MyViewHolder holder, final int position) {
        final Item item = itemList.get(position);
        holder.title.setText(item.getTitle());
        holder.image.setImageResource(item.getResId());
        Bitmap bitmap = BitmapFactory.decodeResource(resources, item.getResId());
        //异步获得bitmap图片颜色值
        Palette.from(bitmap).generate(new Palette.PaletteAsyncListener() {
            @Override
            public void onGenerated(Palette palette) {
                // Palette提取颜色
                Palette.Swatch vibrant = palette.getVibrantSwatch();//有活力
                Palette.Swatch c = palette.getDarkVibrantSwatch();//有活力 暗色
                Palette.Swatch d = palette.getLightVibrantSwatch();//有活力 亮色
                Palette.Swatch f = palette.getMutedSwatch();//柔和
                Palette.Swatch a = palette.getDarkMutedSwatch();//柔和 暗色
                Palette.Swatch b = palette.getLightMutedSwatch();//柔和 亮色

                if (vibrant != null) {
                    int color1 = vibrant.getBodyTextColor();//内容颜色
                    int color2 = vibrant.getTitleTextColor();//标题颜色
                    int color3 = vibrant.getRgb();//rgb颜色
                    if(position<4) {
                        holder.title.setBackgroundColor(f.getRgb());
                        holder.title.setTextColor(f.getTitleTextColor());
                    }else{
                        holder.title.setBackgroundColor(vibrant.getRgb());
                        holder.title.setTextColor(vibrant.getTitleTextColor());
                    }
                }
            }
        });
    }

    @Override
    public int getItemCount() {
        return null == itemList ? 0 : itemList.size();
    }

    public class MyViewHolder extends RecyclerView.ViewHolder {

        public TextView title;
        public ImageView image;

        public MyViewHolder(View itemView) {
            super(itemView);
            title = (TextView) itemView.findViewById(R.id.item_title);
            image = (ImageView) itemView.findViewById(R.id.item_image);
        }
    }
}

5、MainActivity的源码:

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private RecyclerView mRecyclerView;

    private RecyclerAdapter mRecyclerAdapter;

    private List<Item> viewData = new ArrayList<Item>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        loadDatas();
        initViews();

    }

    private void loadDatas() {
        viewData.add(new Item("第1张图", R.mipmap.item1));
        viewData.add(new Item("第2张图", R.mipmap.item2));
        viewData.add(new Item("第3张图", R.mipmap.item3));
        viewData.add(new Item("第4张图", R.mipmap.item4));
        viewData.add(new Item("第5张图", R.mipmap.item5));
        viewData.add(new Item("第6张图", R.mipmap.item6));
        viewData.add(new Item("第7张图", R.mipmap.item7));
        viewData.add(new Item("第8张图", R.mipmap.item8));
    }

    private void initViews() {
        mRecyclerView = (RecyclerView) findViewById(R.id.demo_recyclerView);
        // 设置布局显示方式,这里我使用都是垂直方式——LinearLayoutManager.VERTICAL
        mRecyclerView.setLayoutManager(new GridLayoutManager(this, 3));
        // 设置添加删除item的时候的动画效果
        mRecyclerView.setItemAnimator(new DefaultItemAnimator());

        // 初始化適配器
        mRecyclerAdapter = new RecyclerAdapter(this, viewData);
        // 设置适配器
        mRecyclerView.setAdapter(mRecyclerAdapter);
    }
}

补充,RecyclerView还有很多可用常用的方法:

RecyclerView添加,删除,更新数据:

notifyDataSetChanged():更新所有数据

notifyItemInserted(int position):在position位置插入数据的时候更新

notifyItemRemoved(int position):移除postion位置的数据的时候更新

notifyItemChanged(int position):当postion位置数据有改变时候更新

notifyItemMoved(int fromPosition, int toPosition):移除从位置formPosition到toPosition位置数据更新

notifyItemRangeChanged(int positionStart, int itemCount)

notifyItemRangeInserted(int positionStart, int itemCount)

notifyItemRangeRemoved(int positionStart, int itemCount)

时间: 2024-11-13 04:02:16

RecyclerView的使用——简单例子的相关文章

从一个简单例子来理解js引用类型指针的工作方式

? 1 2 3 4 5 6 7 <script> var a = {n:1};  var b = a;   a.x = a = {n:2};  console.log(a.x);// --> undefined  console.log(b.x);// --> [object Object]  </script> 上面的例子看似简单,但结果并不好了解,很容易把人们给想绕了--"a.x不是指向对象a了么?为啥log(a.x)是undefined?".&

Hadoop RPC简单例子

jdk中已经提供了一个RPC框架-RMI,但是该PRC框架过于重量级并且可控之处比较少,所以Hadoop RPC实现了自定义的PRC框架. 同其他RPC框架一样,Hadoop RPC分为四个部分: (1)序列化层:Clent与Server端通信传递的信息采用了Hadoop里提供的序列化类或自定义的Writable类型: (2)函数调用层:Hadoop RPC通过动态代理以及java反射实现函数调用: (3)网络传输层:Hadoop RPC采用了基于TCP/IP的socket机制: (4)服务器端

extern外部方法使用C#简单例子

外部方法使用C#简单例子 1.增加引用using System.Runtime.InteropServices; 2.声明和实现的连接[DllImport("kernel32", SetLastError = true)] 3.声明外部方法public static extern int GetCurrentDirectory(int a, StringBuilder b); 4.对外部方法操作  GetCurrentDirectory(300, pathstring); using

事件简单例子

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Runtime.InteropServices; 6 7 namespace EventTest 8 { 9 /// <summary> 10 /// 事件订阅者类 11 /// </summary> 12 class Program 13 { 14 static v

spring mvc(注解)上传文件的简单例子

spring mvc(注解)上传文件的简单例子,这有几个需要注意的地方1.form的enctype=”multipart/form-data” 这个是上传文件必须的2.applicationContext.xml中 <bean id=”multipartResolver” class=”org.springframework.web.multipart.commons.CommonsMultipartResolver”/> 关于文件上传的配置不能少 大家可以看具体代码如下: web.xml &

自定义隐式转换和显式转换c#简单例子

自定义隐式转换和显式转换c#简单例子 (出自朱朱家园http://blog.csdn.net/zhgl7688) 例子:对用户user中,用户名first name和last name进行转换成合成一个限定长度为10个字符新name. 自定义隐式转换: namespace transduction { public partial class transductionForm : Form { public transductionForm() { InitializeComponent();

使用fastjson转换json的简单例子

pom添加依赖: <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.1.41</version> </dependency> 代码: package JsonTest.JsonTest; import java.util.ArrayList; import java.util.Hash

最简单例子图解JVM内存分配和回收

一.简介 JVM采用分代垃圾回收.在JVM的内存空间中把堆空间分为年老代和年轻代.将大量(据说是90%以上)创建了没多久就会消亡的对象存储在年轻代,而年老代中存放生命周期长久的实例对象.年轻代中又被分为Eden区(圣经中的伊甸园).和两个Survivor区.新的对象分配是首先放在Eden区,Survivor区作为Eden区和Old区的缓冲,在Survivor区的对象经历若干次收集仍然存活的,就会被转移到年老区. 简单讲,就是生命期短的对象放在一起,将少数生命期长的对象放在一起,分别采用不同的回收

BIP_Case_以RDF为数据源以RTF为模板的简单例子

一. 汇总    1. 建立rdf报表    2. 开发rtf模板    3. 建立可执行程式    4. 建立并发程式    5. 注册data defination    6. 注册template    7. 运行程式    8. 开发程式中间,需将输出模式修改为xml,产生xml文件,以做rtf开发准备原始数据 二.分步解析1. 建立rdf报表2. 开发rtf模板3. 建立可执行程式4. 建立并发程式5. 注册data defination6. 注册template7. 运行程式8. 开