RecyclerView控件学习01
2017-01-21 09:59
239 查看
通过导入support-v7开发包,实现低版本下的开发工具能使用高版本中出现的控件。该控件的作用用于在有限的窗口下展示大量的数据。相比于ListView和GridView ,RecycleView有自己的优势。
*LayoutManager,控制显示的方式
* ItemDecoration,控制item的间隔
* Item的增删动画 ItemAnimator
* 点击事件需要手动实现
鉴于对ListView的理解,看看RecycleView的使用
可以看出RecycleView高度的自由解耦。
看一个demo
layout.xml
Item布局文件
效果图:http://img.blog.csdn.net/20150415145840351
发现Item之间没有分割线,同时没有divider这种属性,RecycleView的优点就在于可以自己定义
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的话需要自己自定义。
GridLayoutManager,网格化,这就体现了RecyclerView的特点,低耦合,自定义性比较高,而不是GridView,ListView这种单一性比较高的控件。
只需要在代码中加入一行
事实上,SystemUI下的QSPanel,也用到了这个RecyclerView控件。
Nav_bar_tuner.xml
这个是statusbar Window下面的,设置了layoutManager,decoration,还有动画。
StaggeredGridLayoutManager,有更大的功能,为我们实现炫酷的效果提供了条件。
本篇主要介绍了RecyclerView的基本使用,还要自定义RecyclerView.Adapter,LayoutManager,Decoration。主要是和listView的一个比较。
下一篇会介绍RecyclerView的点击事件
*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的点击事件
相关文章推荐
- 学习RecyclerView控件
- Material Design学习之RecyclerView(更强大的滚动控件)(4)
- Android学习_01——AutoCompleteTextView控件和MultiAutoCompleteTextView控件的应用
- RecyclerView控件学习2
- iOS学习之UIPickerView控件的简单使用
- IOS学习之UIPickerView控件的关联选择
- 《Android开发从零开始》——38.WebView控件学习
- 【android基础学习之四】——基础控件CheckBox,Spinner,AutoCompleteTextView,DatePicker,TimePicker
- 《Android开发从零开始》——4.TextView控件学习
- android常用控件学习之TextView和EditView
- IOS学习之UIPickerView控件的简单使用
- 10-9学习日记(map标签),FormView控件,ISAPI_REWRITE
- iOS学习之UIPickerView控件的简单使用
- 关于界面控件的学习3【spinner、autocompletetextview、NotificationBar】
- Android总结笔记01:自定义View学习(一)
- iOS学习之UIPickerView控件的关联选择
- 《Android开发从零开始》——38.WebView控件学习
- Dotnet_c#循环学习笔记_01_Panel控件
- TextView控件学习
- 《Android开发从零开始》——38.WebView控件学习