您的位置:首页 > 移动开发 > Android开发

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

2015-10-22 18:31 676 查看
本篇介绍一个更好用更强大的滑动组件 – 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的布局管理器很强大,当然也可以自定义,这些只是简单的介绍。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: