Android Recycleview的用法

来源:互联网 发布:activiti engine源码 编辑:程序博客网 时间:2024/05/22 01:47

前言

最近没得什么项目可以做,闲来无事想写一些东西,看了看以前做的项目,用到的最多的就是列表了,今天就说一下recycleview。

这个世界并不是掌握在那些嘲笑者的手中,而恰恰掌握在能够经受得住嘲笑与批评仍不断往前走的人手中。


RecycleView 的介绍

自Android 5.0之后,谷歌公司推出了RecylerView控件,主要用于列表的展示是一个很强大的滑动组件,说到这里就会想到不是已经有listview吗?为啥还要弄一个recycleview出来了?确实我觉得这个问题回答很简单,之所以出他是因为他肯定比listview强大的,不然谷歌为啥要出它。

recycleview与listview的比较
相同:都可以实现垂直方向的滚动列表效果;都需要使用适配器(Adapter)。
不同点:ListView只能实现垂直滚动列表,但RecyclerView还可以实现水平、多列、跨列等复杂的滚动列表;RecyclerView不但需要Adapter,还必须有LayoutManager,用法更复杂一些。

recycleview说:你listview管不了的我要管,你listview管的了的我也要管,我recycleview说的,listview我吃定了,耶稣也留不住。
listview说:牛bi!


线性布局的Recycleview

效果图:
这里写图片描述

先来看看XML的布局:

 <android.support.v7.widget.RecyclerView        android:id="@+id/xian_recycle"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:padding="16dp">        </android.support.v7.widget.RecyclerView>

再来看看每一个Item的布局是怎样的

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:layout_marginTop="5dp"    android:orientation="vertical">    <LinearLayout        android:layout_width="match_parent"        android:layout_height="100dp"        android:orientation="horizontal">        <ImageView            android:id="@+id/img"            android:layout_width="150dp"            android:layout_height="match_parent" />            <TextView                android:id="@+id/name"                android:layout_width="match_parent"                android:layout_height="match_parent"                android:gravity="center"                android:textColor="#363535"                android:textSize="14sp" />    </LinearLayout>    <View        android:layout_width="match_parent"        android:layout_height="1dp"        android:background="#cfcdcd"></View></LinearLayout>

adapter的写法

public class XianAdapter extends RecyclerView.Adapter<XianAdapter.XianHolder> {    private Context context = null;    //数据集合    private ArrayList<Name> list = null;    //点击事件的接口    private ItemClick click = null;    public XianAdapter(Context context) {        this.context = context;        list = new ArrayList<>();    }    public ItemClick getClick() {        return click;    }    public void setClick(ItemClick click) {        this.click = click;    }    public ArrayList<Name> getList() {        return list;    }    public void setList(ArrayList<Name> list) {        this.list = list;    }    @Override    public XianHolder onCreateViewHolder(ViewGroup parent, int viewType) {    //添加item的布局文件        View view = LayoutInflater.from(context).inflate(R.layout.xian_recycle_item, parent, false);        XianHolder holder = new XianHolder(view);        return holder;    }    @Override    public void onBindViewHolder(XianHolder holder, final int position) {        //给每个item设置数据        if (list != null) {            holder.img.setImageResource(list.get(position).getImg());            holder.name.setText(list.get(position).getName());        }        //给每个item添加监听        if (click != null) {            holder.itemView.setOnClickListener(new View.OnClickListener() {                @Override                public void onClick(View v) {                    click.ItemClick(position);                }            });        }    }    @Override    public int getItemCount() {        //列表的长度        return list.size();    }    class XianHolder extends RecyclerView.ViewHolder {        //找到布局文件里面的控件        private ImageView img = null;        private TextView name = null;        public XianHolder(View itemView) {            super(itemView);            img = (ImageView) itemView.findViewById(R.id.img);            name = (TextView) itemView.findViewById(R.id.name);        }    }}

这个地方我做了一个数据的类Name

public class Name {    private String name = null;    private int img = 0;    public Name(String name, int img) {        this.name = name;        this.img = img;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getImg() {        return img;    }    public void setImg(int img) {        this.img = img;    }}

还有一个接口文件

public interface ItemClick {    void ItemClick(int position);}

再来看看主页面是怎么写的:

public class XianActivity extends AppCompatActivity{    private RecyclerView recyclerView = null;    private XianAdapter adapter = null;    private ArrayList<Name> list = null;    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        initData();        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_xian);        initView();    }    public void initView(){        //找到recycleview        recyclerView = (RecyclerView) findViewById(R.id.xian_recycle);        //指定布局方式这个地方时线性布局        RecyclerView.LayoutManager manager = new LinearLayoutManager(this);        //指定好的设置给recycleview        recyclerView.setLayoutManager(manager);        //适配器弄出来        adapter = new XianAdapter(this);        //把添加好数据的结合传给适配器        adapter.setList(list);        //监听也是一样        adapter.setClick(click);        //recycleview设置适配器        recyclerView.setAdapter(adapter);        //adapter更新数据        adapter.notifyDataSetChanged();    }    //item的监听事件    private ItemClick click = new ItemClick() {        @Override        public void ItemClick(int position) {        //点击弹出每一行的名字            Toast.makeText(XianActivity.this, list.get(position).getName(), Toast.LENGTH_SHORT).show();        }    };    //插入数据    public void initData(){        list = new ArrayList<>();        list.add(new Name(" 蒙奇·D·路飞",R.mipmap.one));        list.add(new Name(" 罗罗亚·索隆 ",R.mipmap.two));        list.add(new Name("香吉士",R.mipmap.three));        list.add(new Name(" 妮可·罗宾",R.mipmap.four));        list.add(new Name("娜美",R.mipmap.five));        list.add(new Name("乌索普",R.mipmap.six));        list.add(new Name("托尼托尼·乔巴",R.mipmap.seven));        list.add(new Name("弗兰奇",R.mipmap.eight));        list.add(new Name("布鲁克 ",R.mipmap.nine));    }}

recycleview网格布局

效果图:
这里写图片描述

要实现这种网格的效果你只需要稍微的改动一下item的布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_margin="5dp"    android:layout_width="match_parent"    android:layout_height="wrap_content">    <ImageView        android:scaleType="fitXY"        android:id="@+id/img"        android:layout_width="150dp"        android:layout_height="100dp" />    <TextView        android:id="@+id/name"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:gravity="center"        android:textColor="#363535"        android:textSize="14sp" /></LinearLayout>

然后改一句话就能实现
把线性布局的:

RecyclerView.LayoutManager manager = new LinearLayoutManager(this);

改成

RecyclerView.LayoutManager manager = new GridLayoutManager(this, 3);

这句话就是用网格布局3表示的一行有多少个。

Recycleview 瀑布流

效果图:
这里写图片描述

改下item布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:background="#ffffff"    android:layout_margin="5dp"    android:layout_width="wrap_content"    android:layout_height="wrap_content">    <ImageView        android:scaleType="fitXY"        android:id="@+id/img"        android:layout_width="match_parent"        android:layout_height="wrap_content" />    <TextView        android:id="@+id/name"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:gravity="center"        android:textColor="#363535"        android:textSize="14sp" /></LinearLayout>

然后改一句话就能实现
把线性布局的:

RecyclerView.LayoutManager manager = new LinearLayoutManager(this);

改成

RecyclerView.LayoutManager manager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);

这样就搞定了瀑布流。

这篇就写到这里了。