RecyclerView已经出来很久了,不过项目里一直用的是ListView和GridView,主要是因为RecyclerView还是在V7包里的,总赶脚应该还有些缺陷,一直也没有去了解,后来发现市场上很多项目里已经用上了这个新的控件,而且感觉视觉效果和体验比之前一直用的ListView更好,就抽时间看了下RecyclerView的相关内容。
先介绍下基本用法:
首先要导入support包:
compile 'com.android.support:appcompat-v7:23.1.1'
布局:
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
在代码里使用:
import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import java.util.ArrayList;
/**
* Created by Aislli on 2016/3/3.
*/
public class SimpleRecyclerViewActivity extends Activity {
private RecyclerView recyclerView;
private LinearLayoutManager linearLayoutManager;
private ArrayList<String> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.content_simple);
initView();
initData();
}
private void initView() {
recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
}
private void initData() {
list = new ArrayList<>();
for (int i = 0; i < 60; i++) {
list.add("item:" + i);
}
SimpleRecyclerViewAdapter simpleRecyclerViewAdapter = new SimpleRecyclerViewAdapter(this, list);
linearLayoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(linearLayoutManager);//设置布局管理器
recyclerView.setAdapter(simpleRecyclerViewAdapter);//设置adapter
}
}
adapter代码:
package com.lcp.arecyclerview;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.Arrays;
import java.util.List;
/**
* Created by Aislli on 2015/12/25.
*/
public class SimpleRecyclerViewAdapter extends RecyclerView.Adapter<SimpleRecyclerViewAdapter.MyViewHolder> {
private Context mContext;
private List<String> mList;
public SimpleRecyclerViewAdapter(Context mContext, List<String> list) {
this.mContext = mContext;
this.mList = list;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
MyViewHolder holder = new MyViewHolder(LayoutInflater.from(
mContext).inflate(R.layout.item_f3_recycler, parent,
false));
return holder;
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.idNum.setText(mList.get(position));
}
@Override
public int getItemCount() {
return mList.size();
}
public void add(String string) {
insert(string, mList.size());
}
public void insert(String string, int position) {
mList.add(position, string);
notifyItemInserted(position);
}
public void remove(int position) {
mList.remove(position);
notifyItemRemoved(position);
}
public void clear() {
int size = mList.size();
mList.clear();
notifyItemRangeRemoved(0, size);
}
public void addAll(String[] strings) {
int startIndex = mList.size();
mList.addAll(startIndex, Arrays.asList(strings));
notifyItemRangeInserted(startIndex, strings.length);
}
class MyViewHolder extends RecyclerView.ViewHolder {
TextView idNum;
public MyViewHolder(View view) {
super(view);
idNum = (TextView) view.findViewById(R.id.id_num);
}
}
}
adapter里的方法和ListView的不一样了,不再通过getView方法去绑定布局和数据了,而是onCreateViewHolder绑定布局,onBindViewHolder方法绑定数据,另一个需要注意的是更新数据时需要使用指定的notifyItemInserted(int position)和notifyItemRemoved(int position)等方法,因为 在RecyclerView里删除和增加item时可以添加动画效果,通过notifyDataSetChanged()方法更新UI是没有动画效果的;上面代码里的add()、insert()、remove()等方法是直接写到当前adapter里了,实际项目里是抽取到BaseAdapter里的,不需要每个adapter里都写一遍这些方法。
代码运行效果:
从上面的最最最简单使用RecyclerView的代码中基本能看出来,架构的高度解耦特点,通过布局管理器RecyclerView.LayoutManager管理布局,可以轻松实现ListView和GridView效果,官方提供了3个RecyclerView.LayoutManager的实现类:
1. LinearLayoutManager:线性布局管理器,可以横向和纵向布局,默认纵向(ListView效果)
2.GridLayoutManager:网格式布局管理器,GridView效果
3.StaggeredGridLayoutManager:瀑布流
上图是linearLayoutManager 布局效果,想从上图效果修改为GridView效果,只需要修改下布局管理器:
private void initData() {
list = new ArrayList<>();
for (int i = 0; i < 60; i++) {
list.add("item:" + i);
}
SimpleRecyclerViewAdapter simpleRecyclerViewAdapter = new SimpleRecyclerViewAdapter(this, list);
// linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager = new GridLayoutManager(this,3);//3列的GridView
recyclerView.setLayoutManager(linearLayoutManager);
recyclerView.setAdapter(simpleRecyclerViewAdapter);
}
其他代码不变,效果如下图:
还有一种官方提供的布局管理器StaggeredGridLayoutManager可以指定GridView是横向还是纵向,可很轻松的实现瀑布流,例如在adapter里加段模拟瀑布流的代码,设置下item的随机高度:
@Override
public void onBindViewHolder(final MyViewHolder holder, final int position) {
holder.idNum.setText(mList.get(position));
ViewGroup.LayoutParams layoutParams = holder.idNum.getLayoutParams();
layoutParams.height = (int) (100 + Math.random() * 400);
holder.idNum.setLayoutParams(layoutParams);
}
调用代码修改为:
private void initData() {
list = new ArrayList<>();
for (int i = 0; i < 60; i++) {
list.add("item:" + i);
}
linearLayoutManager = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);//3列竖着排列的布局
mReListAdapter = new RcGridFallAdapter(this, list);
mRecyclerView.setLayoutManager(linearLayoutManager);
mRecyclerView.setAdapter(mReListAdapter);
setListener();
}
效果如下图:
OK,上面就是最简单使用RecyclerView的例子,代码很简单,和下一篇一起上传,下一篇实现RecyclerView的下拉刷新和上拉加载更多。