浅谈RecyclerView(一)

写在前面的话。

从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了,好吧,下篇文章加个分隔线再看看!



  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值