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

本篇介绍一个更好用更强大的滑动组件 – 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的布局管理器很强大,当然也可以自定义,这些只是简单的介绍。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值