android RecyclerView的基本介绍及用法(一)

来源:互联网 发布:jquery实现数据分页 编辑:程序博客网 时间:2024/05/21 17:20

本篇介绍一个更好用更强大的滑动组件 – RecyclerView。

简介:

RecyclerView 是 android-support-v7 包中的控件,它的功能效果类似ListView,其特点有:

  • RecyclerView 的Item可以回收复用,当然,这不是一个新功能,ListView中就有此机制。但是ListView的回收等功能是紧密耦合在一起的,而 RecyclerView使方法更灵活,开发者也能自定义各种各样的显示效果。并且 ViewHolder 是直接被封装起来的,我们只要实现自己的 ViewHolder 即可。

  • 和ListView不一样的是,RecyclerView不再负责Item的摆放等显示方面的功能。所有和布局、绘制等方面的工作Google将其拆分成不同的类进行管理,开发者可以自定义各种各样满足定制需求的的功能类。
    ① RecyclerView.Adapter:托管数据集合,为每个Item创建视图。
    ②RecyclerView.ViewHolder:承载Item视图的子视图。
    ③RecyclerView.LayoutManager:负责Item视图的布局。
    ④RecyclerView.ItemDecoration:为每个Item视图绘制Divider。
    ⑤RecyclerView.ItemAnimator 添加、删除数据时的动画效果。

  • RecyclerView 使用布局管理器管理子view的位置,将 layout 抽象成了一个 LayoutManager, 我们可以通过 LayoutManager 来实现不同的布局效果。比如:线性 ListView、横向 ScrollView、GridView、瀑布流等类似效果都可以很容易的实现。
    LinearLayoutManager提供了如下几个方法来帮助开发者获取屏幕上的顶部item和底部item:
    findFirstVisibleItemPosition()
    findFirstCompletelyVisibleItemPosition()
    findLastVisibleItemPosition()
    findLastCompletelyVisibleItemPosition()

  • RecyclerView 自带了ItemAnimation,可以设置加载和移除时的动画,方便做出各种动态浏览的效果。提供了默认动画效果:DefaultItemAnimator,当然也可以继承 LayoutManager 自定义动画效果。
    为了让动画效果起效,开发者必须通知Adapter数据有改变。RecyclerView.Adapter提供了许多通知方法,例如:
    public final void notifyItemInserted(int position)
    public final void notifyItemRemoved(int position)

  • RecyclerView 中没有提供 OnItemClickListener 和 OnItemLongClickListener 的监听事件,需要自己在adapter里面写接口实现。

用法:
基本使用效果图
这里写图片描述

首先记得添加 v7包 。

直接上代码:
适配器MyRecyclerViewAdapter.java

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.List;/** * Created by jia on 2015/10/16. */class MyRecyclerViewAdapter extends RecyclerView.Adapter {    private Context context;    private List<String> list;    public MyRecyclerViewAdapter(Context context, List<String> list) {        this.context = context;        this.list = list;    }    /**     * onCreateViewHolder中负责为Item创建视图     *     * @param viewGroup     * @param i     * @return     */    @Override    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {        /*初始化填充RecyclerView的item*/        View viewItem = LayoutInflater.from(context).inflate(R.layout.list_item, viewGroup, false);        /*返回自定义的ViewHolder*/        MyViewHolder myViewHolder = new MyViewHolder(viewItem);        return myViewHolder;    }    /**     * onBindViewHolder负责将数据绑定到Item的视图上。     *     * @param viewHolder     * @param position     */    @Override    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {        /*将接收到的ViewHolder强转成自定义的VIewHolder*/        final MyViewHolder myViewHolder = (MyViewHolder) viewHolder;        /*为Item设置数据*/        myViewHolder.getIdView().setText(list.get(position));        myViewHolder.getNameView().setText("name");    }    /**     * 本方法决定了绘制item的数量     *     * @return     */    @Override    public int getItemCount() {        return list.size();    }    class MyViewHolder extends RecyclerView.ViewHolder {        private TextView idView;        private TextView nameView;        public MyViewHolder(View itemView) {            super(itemView);            idView = (TextView) itemView.findViewById(R.id.id);            nameView = (TextView) itemView.findViewById(R.id.name);        }        public TextView getIdView() {            return idView;        }        public TextView getNameView() {            return nameView;        }    }}

使用RecyclerView的步骤:
①实例化RecyclerView;
②设置布局管理器LayoutManager;
③可以设置一个或多个ItemDecorations,也可以不设置;
④可以设置ItemAnimator,默认动画DefaultItemAnimator;
⑤设置Adapater适配数据。

主界面MainActivity.java

package com.practice.jia.recyclerviewblog;import android.os.Bundle;import android.support.v7.app.ActionBarActivity;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import java.util.ArrayList;import java.util.List;public class MainActivity extends ActionBarActivity {    private RecyclerView recyclerView;    private MyRecyclerViewAdapter adapter;    private List<String> list;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        recyclerView = (RecyclerView) findViewById(R.id.recyclerView);        initData();        /*         * 初始化一个布局管理器,这里是默认的竖直线性,效果如上图所示         * 其实完整写法为:         * LinearLayoutManager manager = new LinearLayoutManager(context, orientation, reverseLayout);         * 其中三个参数分别表示:         * 1.context:上下文         * 2.orientation:布局方向;         *      LinearLayoutManager.VERTICAL:竖直方向(默认)         *      LinearLayoutManager.HORIZONTAL:水平方向         * 3.reverseLayout:布局数据是否反向;false:正常(默认);true:反向;         * 下边的写法就相当于:new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);         */        LinearLayoutManager manager = new LinearLayoutManager(this);        recyclerView.setLayoutManager(manager);        adapter = new MyRecyclerViewAdapter(MainActivity.this, list);        recyclerView.setAdapter(adapter);    }    /**     * 初始化集合,添加数据     */    private void initData() {        list = new ArrayList<>();        for (int i = 0; i < 100; i++) {            list.add("id:" + i);        }    }}

下面看一下其他效果:

/*竖直列表,布局数据不反向,效果类似传统ListView*/LinearLayoutManager manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);/*竖直列表,布局数据反向*/LinearLayoutManager manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, true);/*横向列表,布局数据正常,效果类似横向ScrollView*/LinearLayoutManager manager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);/*横向列表,布局数据反向*/LinearLayoutManager manager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, true);
/* *GridLayoutManager效果相当于Gridview * new GridLayoutManager(context,spanCount, orientation, reverseLayout); * 四个参数分别表示: * 1.context:上下文 * 2.spanCount:列数(横向就是行数),相当于Gridview的numColumns属性 * 3.orientation:布局方向; *      LinearLayoutManager.VERTICAL:竖直方向(默认) *      LinearLayoutManager.HORIZONTAL:水平方向 * 4.reverseLayout:布局数据是否反向;false:正常(默认);true:反向; *//*竖直表格列表,3列,布局数据不反向,效果类似传统GridView*/GridLayoutManager manager = new GridLayoutManager(this, 3, LinearLayoutManager.VERTICAL, false);/*竖直表格列表,3列,布局数据反向*/GridLayoutManager manager = new GridLayoutManager(this, 3, LinearLayoutManager.VERTICAL, true);/*横向表格列表,3行,布局数据正常*/GridLayoutManager manager = new GridLayoutManager(this, 3, LinearLayoutManager.HORIZONTAL, false);/*横向表格列表,3行,布局数据反向*/GridLayoutManager manager = new GridLayoutManager(this, 3, LinearLayoutManager.HORIZONTAL, true);

RecyclerView的布局管理器很强大,当然也可以自定义,这些只是简单的介绍。

1 0
原创粉丝点击