您的位置:首页 > 其它

RecyclerView控件学习01

2017-01-21 09:59 239 查看
通过导入support-v7开发包,实现低版本下的开发工具能使用高版本中出现的控件。该控件的作用用于在有限的窗口下展示大量的数据。相比于ListView和GridView ,RecycleView有自己的优势。

*LayoutManager,控制显示的方式

* ItemDecoration,控制item的间隔

* Item的增删动画 ItemAnimator

* 点击事件需要手动实现

鉴于对ListView的理解,看看RecycleView的使用

mRecyclerView = findView(R.id.id_recyclerview);
//设置布局管理器
mRecyclerView.setLayoutManager(layout);
//设置adapter
mRecyclerView.setAdapter(adapter)
//设置Item增加、移除动画
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
//添加分割线
mRecyclerView.addItemDecoration(new DividerItemDecoration(
getActivity(), DividerItemDecoration.HORIZONTAL_LIST))


可以看出RecycleView高度的自由解耦。

看一个demo

public class HomeActivity extends ActionBarActivity
{

private RecyclerView mRecyclerView;
private List<String> mDatas;
private HomeAdapter mAdapter;

@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_single_recyclerview);

initData();
mRecyclerView = (RecyclerView) findViewById(R.id.id_recyclerview);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mRecyclerView.setAdapter(mAdapter = new HomeAdapter());

}

protected void initData()
{
mDatas = new ArrayList<String>();
for (int i = 'A'; i < 'z'; i++)
{
mDatas.add("" + (char) i);
}
}

class HomeAdapter extends RecyclerView.Adapter<HomeAdapter.MyViewHolder>
{

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
MyViewHolder holder = new MyViewHolder(LayoutInflater.from(
HomeActivity.this).inflate(R.layout.item_home, parent,
false));
return holder;
}

@Override
public void onBindViewHolder(MyViewHolder holder, int position)
{
holder.tv.setText(mDatas.get(position));
}

@Override
public int getItemCount()
{
return mDatas.size();
}

class MyViewHolder extends ViewHolder
{

TextView tv;

public MyViewHolder(View view)
{
super(view);
tv = (TextView) view.findViewById(R.id.id_num);
}
}
}

}


layout.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<android.support.v7.widget.RecyclerView
android:id="@+id/id_recyclerview"
android:divider="#ffff0000"
android:dividerHeight="10dp"
android:layout_width="match_parent"
android:layout_height="match_parent" />

</RelativeLayout>


Item布局文件

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:background="#44ff0000"
android:layout_height="wrap_content" >

<TextView
android:id="@+id/id_num"
android:layout_width="match_parent"
android:layout_height="50dp"
android:gravity="center"
android:text="1" />
</FrameLayout>


效果图:http://img.blog.csdn.net/20150415145840351

发现Item之间没有分割线,同时没有divider这种属性,RecycleView的优点就在于可以自己定义

itemDecoration

我们可以通过该方法添加分割线:

mRecyclerView.addItemDecoration()

该方法的参数为RecyclerView.ItemDecoration,该类为抽象类,官方目前并没有提供默认的实现类(我觉得最好能提供几个)。

该类的源码

“`

public static abstract class ItemDecoration {

public void onDraw(Canvas c, RecyclerView parent, State state) {

onDraw(c, parent);

}

public void onDrawOver(Canvas c, RecyclerView parent, State state) {

onDrawOver(c, parent);

}

public void getItemOffsets(Rect outRect, View view, RecyclerView parent, State state) {

getItemOffsets(outRect, ((LayoutParams) view.getLayoutParams()).getViewLayoutPosition(),

parent);

}

@Deprecated

public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) {

outRect.set(0, 0, 0, 0);

}

“` 当我们调用mRecyclerView.addItemDecoration()方法添加decoration的时候,RecyclerView在绘制的时候,去会绘制decorator,即调用该类的onDraw和onDrawOver方法。

系统没有提供实现类,所以说使用RecyclerView要实现item之间的divider的话需要自己自定义。

LayoutManager

现在我们还不能体会的RecyclerView的优点,好在系统提供了几个LayoutManager的实现类,

LinearLayoutManager 现行管理器,支持横向、纵向。
GridLayoutManager 网格布局管理器
StaggeredGridLayoutManager 瀑布就式布局管理器


GridLayoutManager,网格化,这就体现了RecyclerView的特点,低耦合,自定义性比较高,而不是GridView,ListView这种单一性比较高的控件。

只需要在代码中加入一行

mRecyclerView.setLayoutManager(new GridLayoutManager(this,4));


事实上,SystemUI下的QSPanel,也用到了这个RecyclerView控件。



Nav_bar_tuner.xml

<android.support.v7.widget.RecyclerView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="match_parent" />


/**
* Allows full-screen customization of QS, through show() and hide().
*
* This adds itself to the status bar window, so it can appear on top of quick settings and
* *someday* do fancy animations to get into/out of it.
*/
public class QSCustomizer extends LinearLayout implements OnMenuItemClickListener {
......
private RecyclerView mRecyclerView;
......
public QSCustomizer(Context context, AttributeSet attrs) {
mRecyclerView = (RecyclerView) findViewById(android.R.id.list);
mTileAdapter = new TileAdapter(getContext());
mRecyclerView.setAdapter(mTileAdapter);
mTileAdapter.getItemTouchHelper().attachToRecyclerView(mRecyclerView);
GridLayoutManager layout = new GridLayoutManager(getContext(), 3);
layout.setSpanSizeLookup(mTileAdapter.getSizeLookup());
mRecyclerView.setLayoutManager(layout);
mRecyclerView.addItemDecoration(mTileAdapter.getItemDecoration());
DefaultItemAnimator animator = new DefaultItemAnimator();
animator.setMoveDuration(TileAdapter.MOVE_DURATION);
mRecyclerView.setItemAnimator(animator);
......
}
}


这个是statusbar Window下面的,设置了layoutManager,decoration,还有动画。

StaggeredGridLayoutManager,有更大的功能,为我们实现炫酷的效果提供了条件。

RecyclerView.Adapter

相比于ListView的BaseAdapter,原理是相似的,但是代码结构会有些不同的地方。

public class GalleryAdapter extends
RecyclerView.Adapter<GalleryAdapter.ViewHolder>  {
//继承一个Adapter,限定了一个自己定义的ViewHolder
//成员变量和构造方法和BaseAdapter差不多
private LayoutInflater mInflater;
private List<Integer> mDatas;
public GalleryAdapter(Context context, List<Integer> datats)
{
mInflater = LayoutInflater.from(context);
mDatas = datats;
}
//相比于BaseAdapter的ViewHolder,这里会继承一个默认的Viewholder
public static class ViewHolder extends RecyclerView.ViewHolder
{
public ViewHolder(View arg0)
{
super(arg0);
}

ImageView mImg;
TextView mTxt;
}
//一样的,返回数量
@Override
public int getItemCount()
{
return mDatas.size();
}
/**
* 创建ViewHolder ,事实上,构造viewholder会传入一个View参数
* 相当于BaseAdapter的getView方法了。此外,ViewHolder也能缓存convertview
*/
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i)
{
View view = mInflater.inflate(R.layout.activity_index_gallery_item,
viewGroup, false);
ViewHolder viewHolder = new ViewHolder(view);

viewHolder.mImg = (ImageView) view
.findViewById(R.id.id_index_gallery_item_image);
return viewHolder;
}

/**
* 设置值
*/
@Override
public void onBindViewHolder(final ViewHolder viewHolder, final int i)
{
viewHolder.mImg.setImageResource(mDatas.get(i));
}
}


本篇主要介绍了RecyclerView的基本使用,还要自定义RecyclerView.Adapter,LayoutManager,Decoration。主要是和listView的一个比较。

下一篇会介绍RecyclerView的点击事件
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息