Android抢Listview饭碗之RecyclerView浅析

1.目录:
         1. RecyclerView 概述
        2. RecyclerView案例之与CardView再结合
        3. 浅析 RecyclerView的 构建 过程
         4. RecyclerView想的到的花样
        5.与ListView比比高低

1.RecyclerView概述
         RecyclerView是Android 5.0 google提出的在有限空间展示大量数据集的控件,与ListView 和GridView类似。它具有高度解耦和高度 自由 定制的优点,通过他我们可以轻松的实现ListView和gridView的效果。

2.RecyclerView案例之与CardView再结合
    在学习CardView的时候我实现了RecyclerView的垂直布局,现在我想实现一个水平布局的cardview集看看,我看别人做的感觉酷炫极了,我也想做一个。
     2.1  截图效果:
        
        
     2.2 卡片布局:cardview_item.xml
    
    
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:padding="10dp"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.CardView
android:id="@+id/card_view"
android:layout_height="280dp"
android:layout_width="192dp"
android:clickable="true"
android:padding="10dp"
android:foreground="?android:attr/selectableItemBackground"
app:cardElevation="10dp"
>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/card_text"
android:layout_centerInParent="true"
android:text="#fff"
android:textColor="#fff"
android:textSize="20sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
 
</android.support.v7.widget.CardView>
</LinearLayout>
     2.3 适配器类:RecyclerViewAdapter.java
    
    
package com.example.recyclerviewdemo;
 
import android.content.Context;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
 
import java.util.ArrayList;
 
/**
* Created by elimy on 2016-12-27.
*/
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.RecyclerHolder> {
private Context context;
private ArrayList<DataObj> list;
 
/*
* 带参构造方法实现上下文和数据集合传递
* */
public RecyclerViewAdapter(Context context, ArrayList<DataObj> list) {
this.context = context;
this.list = list;
}
 
/*
* 创建一个到View的映射,避免重复使用findViewById(),提高效率
* */
@Override
public RecyclerViewAdapter.RecyclerHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view= LayoutInflater.from(context).inflate(R.layout.cardview_item,parent,false);
 
RecyclerHolder recyclerHolder = new RecyclerHolder(view);
return recyclerHolder;
}
 
/*
* 将布局与数据集绑定
* */
@Override
public void onBindViewHolder(RecyclerViewAdapter.RecyclerHolder holder, int position) {
final int pos=position;
 
//给TextView设置文本
holder.textView.setText(list.get(position).getText());
 
//给cardView设置背景颜色
holder.cardView.setBackgroundColor(context.getResources().getColor(list.get(position).getBgColor()));
 
//cardView点击事件
holder.cardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context,"点击了地"+pos+"个Card",Toast.LENGTH_SHORT).show();
}
});
}
 
/*
* 继承返回list数据集的大小
* */
@Override
public int getItemCount() {
return list.size();
}
 
/*
* 继承RecyclerView.ViewHolder实现自定义的ViewHolder
* */
class RecyclerHolder extends RecyclerView.ViewHolder {
CardView cardView;
TextView textView;
 
public RecyclerHolder(View itemView) {
super(itemView);
cardView=(CardView) itemView.findViewById(R.id.card_view);
textView= (TextView) itemView.findViewById(R.id.card_text);
}
}
}
     2.4 数据对象类:DataObj.java
    
    
package com.example.recyclerviewdemo;
 
import android.graphics.Color;
 
import java.io.Serializable;
 
/**
* Created by elimy on 2016-12-27.
*/
public class DataObj implements Serializable {
 
private int bgColor;
private String text;
 
public String getText() {
return text;
}
 
public void setText(String text) {
this.text = text;
}
 
public int getBgColor() {
return bgColor;
}
 
public void setBgColor(int bgColor) {
this.bgColor = bgColor;
}
 
public DataObj(int bgColor, String text) {
this.bgColor = bgColor;
this.text = text;
}
 
 
 
}
     2.5 主布局文件:actvitity_main.xml
    
    
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
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"
android:orientation="vertical"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="com.example.recyclerviewdemo.MainActivity">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view_one"
android:layout_width="match_parent"
android:layout_weight="1"
android:layout_height="0dp">
 
</android.support.v7.widget.RecyclerView>
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view_two"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="0dp">
 
</android.support.v7.widget.RecyclerView>
 
</LinearLayout>
     2.6 主布局类:MainActivity.java
    
    
package com.example.recyclerviewdemo;
 
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
 
import java.util.ArrayList;
 
public class MainActivity extends AppCompatActivity {
 
RecyclerView recyclerView01,recyclerView02;
ArrayList<DataObj> list;
RecyclerViewAdapter adapter;
 
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//绑定布局
recyclerView01= (RecyclerView) findViewById(R.id.recycler_view_one);
recyclerView02= (RecyclerView) findViewById(R.id.recycler_view_two);
//初始化数据集
initData();
//设置水平布局
LinearLayoutManager layoutManager=new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false);
LinearLayoutManager layoutManager02=new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false);
 
recyclerView01.setLayoutManager(layoutManager);
recyclerView02.setLayoutManager(layoutManager02);
 
//设置适配器
adapter=new RecyclerViewAdapter(this,list);
recyclerView01.setAdapter(adapter);
recyclerView02.setAdapter(adapter);
 
}
 
/*
* 构造CardView显示的文本以及背景集合
* */
private void initData() {
list=new ArrayList<>();
list.add(new DataObj(R.color.bgColor1,"#d71345"));
list.add(new DataObj(R.color.bgColor2,"#8a2e3b"));
list.add(new DataObj(R.color.bgColor3,"#00a6ac"));
list.add(new DataObj(R.color.bgColor4,"#2585a6"));
list.add(new DataObj(R.color.bgColor5,"#006c54"));
list.add(new DataObj(R.color.bgColor6,"#ed1941"));
list.add(new DataObj(R.color.bgColor7,"#1d953f"));
list.add(new DataObj(R.color.bgColor8,"#007d65"));
}
}
     2.8 颜色资源:color.xml
    
    
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#3F51B5</color>
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#FF4081</color>
<color name="bgColor1">#d71345</color>
<color name="bgColor2">#8a2e3b</color>
<color name="bgColor3">#00a6ac</color>
<color name="bgColor4">#2585a6</color>
<color name="bgColor5">#006c54</color>
<color name="bgColor6">#ed1941</color>
<color name="bgColor7">#1d953f</color>
<color name="bgColor8">#007d65</color>
 
</resources>
3.浅析RecyclerView的构建过程
         前面写了一个简单的水平滑动的RecyclerView案例,我就这个案例简单理理RecyclerView 构建 过程
首先列出其中涉及的角色以及每个角色的作用:
            (1)  数据对象( 这里是DataObj)————>相当于保存着单个item需要显示的数据 
            (2)  数据集(由 DataObj构成 )  ————>由   数据对象构成的集合,为布局提供多条数据
          (3) 适配器Adapter(这里是RecyclerViewAdapter)   ————>将数据项与UI绑定起来,见名知意就是适配数据与布局,同时在里面还会做一些其他的操作,比如事件监听,布局属性设置等等;后面对这个adapter的各个方法再进行细致分析
 
          (4) 布局管理器LayoutManager(这里是LinearLayoutManager)  ————>布局管理器的作用当然是管理布局啦,通过他来指定RecycleView的显示样式,水平还是竖着,瀑布流形式还是gridview形式。
  
          (5) 单个数据项item布局(这里是cardview_item.xml)   ————>展示每一数据项的布局
          (6) 主布局(这里是包含两个RecyclerView的activity_main.xml)   ————>数据集展示布局

上面把一些必要的角色都梳理了一遍,当然还有没提及的这里就不扩展了,后面分步学习,其实重点在适配器的实现和布局管理器这两个角色上,接下来我们走进
适配器Adapter( RecyclerViewAdapter)看看。
    1 .他继承自RecyclerView.Adapter<RecyclerViewAdapter.RecyclerHolder>这里的泛型类来自RecyclerViewAdapter类中的自定义类RecyclerHolder
    2. RecyclerHolder是继承自RecyclerView.ViewHolder的自定义类,在里面通过带一个参数的构造函数传递的布局view实现与布局的映射建立
    3. 重写了类RecyclerView.Adapter的getItemCount(),onBindViewHolder(RecyclerViewAdapter.RecyclerHolder holder, int position) 和onCreateViewHolder(ViewGroup parent, int viewType)三个方法:
          getItemCount()//计算返回数据集的长度
          onBindViewHolder (RecyclerViewAdapter.RecyclerHolder holder,  int   position) //为holder中持有的布局绑定数据
        onCreateViewHolder(ViewGroup parent,  int  viewType)//通 LayoutInflater.from(context).inflate()获取到单个数据项的布局View,然后实例化并返回一个ViewHolder对象返回
    ps: 可能细心的伙伴会发现 viewType参数好像我们并没有用上,不知道有啥用,其实这个参数是在我们需要实现混排的效果时才会用到的,后面会进行学习。

布局管理器的类型也有3种:
         1.StaggeredGridLayoutManager
        2.LinearLayoutManager
        3.GridLayoutManager
通过这三种布局管理器我们可以实现不同的布局花样,后面会一步一步的运用并进行学习。
4.RecyclerView想的到的花样
         1.RecyclerView为数据项设置分割线
         2.实现有头有尾的RecyclerView数据展示
        3.实现ListView GridView混排
         4.实现瀑布流
        5.实现RecyclerView单个数据项删除动画效果

5.与ListView比比高低
         其实从实现上来说RecyclerView只是帮我们封装了ViewHolder并将它作为了整个的缓存单元,将所有布局的映射都保存在内,同时ListView中的ConvertView在这个时候相当于 ViewHolder的一个成员变量,或者说是一个构造参数,通过他的findViewById()方法来持有布局的映射(如果理解不到可以对比一下ListView和RecyclerView实现代码)。
         
         从功能上来说ListView能实现的RecyclerView同样能实现,同时他比ListView多了一些扩展功能,比如之前说的设置item添加和删除的动画,实现瀑布流,以及GridView布局,其实从另外一方面来说RecyclerView的扩展性和定制性更强了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值