写在前面的话。
从2011年的6月,孤身来到北京,在北大青鸟培训了两年(这里不是为青鸟打广告)。现在想想人生中的两年并不短,有人问我说用两年的时间就为培训技术,你后悔吗?我说,不后悔!在我看来,这两年是我真正打下基础的两年,也是我人生转折的两年。
扯得有点远了,在这几年里,也看了好多人写的博客。尽管自己偶尔也写写一点总结啊什么的,但是我觉得以我的水平还不足以写出一篇出色的博文,因此这个想法就一直搁浅了下来。直到今年我的观念才慢慢发生变化,写博客嘛,写的不好又能怎样呢?不敢迈出第一步,永远不会有机会成功。所有才有了我这第一篇处女作。
好了,废话不多说了,为什么想到写一下RecyclerView呢?是因为我看了好多类似的文章,也研究了好久,下面只是把我的理解写下来。
先说说为什么要用RecyclerView吧。早在2015年的时候,我就已经接触了RecyclerView,但当时只是抱着对新技术的探究,简单的看了一下。那时候觉得没什么新鲜的啊,还不是和ListView、GridView一样啊,都是列表展示数据的,ListView我用的很熟了,各种优化方法也都基本OK了,为啥还要用这个呢,由此,这一年多来我还是依然坚持着我的ListView。直到前一段时间,我偶然间又翻了翻大牛们的博客,发现好多人依然在写着RecyclerView相关的文章,这个发现一下子就触动了我,为什么?心里连续几次的问自己。这个现象说明大神们都在用的东西被我抛弃了,这样下去我怎么能成为一个牛掰的程序员呢(有一句话说只有紧跟着大神们的脚步,你才能更牛掰)。最后,下定决心,重新好好的研究一下到底RecyclerView的魅力在哪里?--答案先容我卖个关子,请往下看。
首先呢,当然是建立Android项目了,这个我就不多说了。
接下来在 build.gradle文件中加上
compile 'com.android.support:recyclerview-v7:24.2.1'
第二步,创建layout文件,并在其中加入recyclerView
第三步,当然就是获取组件了
第四步,重点来了,开始写一个适配器。创建RecyclerView的适配器必须继承RecyclerView.Adapter<VH>,还需要注意的是,创建的VH必须继承RecyclerView.ViewHolder,完整代码如下:
package com.demo.recyclerview.adapter;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.demo.recyclerview.R;
import java.util.ArrayList;
import java.util.List;
/**
* recycler view adapter
* Created by sun on 2016/12/8.
*/
public class TextRecyclerAdapter extends RecyclerView.Adapter<TextRecyclerAdapter.TextViewHolder> implements View.OnClickListener {
private final LayoutInflater layoutInflater;
private List<String> list;
public TextRecyclerAdapter(Context context) {
layoutInflater = LayoutInflater.from(context);
}
/**
* 设置数据
* @param data
*/
public void setData(List<String> data) {
this.list = new ArrayList<>(data);
}
@Override
public TextRecyclerAdapter.TextViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// 构建ViewHolder
return new TextViewHolder(layoutInflater.inflate(R.layout.layout_item_text, parent, false));
}
@Override
public void onBindViewHolder(TextRecyclerAdapter.TextViewHolder holder, int position) {
// 设置数据
holder.tvText.setText(list.get(position));
// 设置点击事件
holder.itemView.setOnClickListener(this);
holder.itemView.setTag(position);
}
@Override
public int getItemCount() {
return list != null ? list.size() : 0;
}
@Override
public void onClick(View view) {
Log.d("=============", "click position:" + view.getTag());
}
static class TextViewHolder extends RecyclerView.ViewHolder {
TextView tvText;
TextViewHolder(View itemView) {
super(itemView);
// 查找item中的组件
tvText = (TextView) itemView.findViewById(R.id.tv_text);
}
}
}
第五步,RecyclerView是通过LayoutManager来设置内容排列方向的,其中包括LinearLayoutManager(线性排列,类似ListView,其实不一样,后面我们再说)、GridLayoutManager(网格排列)、StaggeredGridLayoutManager(瀑布流)。
下面我们先来看线性排列:
recyclerView.setLayoutManager(new LinearLayoutManager(this));
展示效果:
是不是和ListView很像,但ListView可以横过来吗?之前的时候,我处理这种横向展示的问题的时候要么是Gallery要么是horizontalscrollview,好麻烦的。现在就不用了啊,只需改个参数就好了,
recyclerView.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false));
展示效果:
就变成水平的了。
接下来我们再来看网格排列,代码如下:
recyclerView.setLayoutManager(new GridLayoutManager(this,2));
第一个参数是Context上下文,第二个参数是网格的列数(当然也可能是行数,what?水平方向表格啊!!!)
展示效果:
是不是很有feel呢。当然,我上面提到了水平网格的,怎么办?还是改个参数就好了,代码如下:
recyclerView.setLayoutManager(new GridLayoutManager(this,2,LinearLayoutManager.HORIZONTAL,false));
展示效果:
什么?样子太丑?好吧,怪我item样式写的太简单了,但至少效果出来了,水平网格哦,用GridView怎么做我还真没研究过,以后可以研究一下。
最后,再来看一下瀑布流,回想一下,自己动手实现瀑布流是不是很麻烦(其实也还好,用ScrollView加上不同的高度就可以实现),RecycleView不需要你重新写一套瀑布流,只需要设置内容排列方式加上不同的高度就OK了,我们来看一下具体实现:
设置内容排列
recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));
设置不同的高度
// 手动设置高度
holder.tvText.setHeight(200 + (position % 3) * 50);
效果展示:
怎么样,简单吧。现在回过头来说一下我在文章最开始提到的问题---RecyclerView的魅力究竟在哪里?接下来,我先回答这篇文章中的魅力,一个字,灵活。展示样式灵活多样,哪天你的boss告诉你说这个列表一行展示一条数据,有点浪费,改改,改成一行两条的。尼玛,苦逼啊,原来的ListView不能用了,改吧,再改个GridView版本的。过几天,boss又说了,有的用户喜欢一条数据,有的用户喜欢两条数据,给我弄个按钮,切换一下。什么?你心中一万条草泥马奔腾而过,但没办法啊,改吧,一个页面里面一个listview和一个GridView,控制显示和隐藏,并且要记录用户滑动的位置......但是用RecyclerView就搞定了啊,动态切换内容排列方式就OK了,是不是遇到救星了。
怎么样,灵活吧,这只是其中一点。有的同学会说,你的界面也太low了,好吧,下篇文章加个分隔线再看看!