RecyclerView的特点
- 自带ViewHolder
- 横向,竖向、列表,多行列表和流式皆可
- 分割线控制方便
使用之前
导入这个md设计包
compile 'com.android.support:design:23.4.0'
如何使用
XML的布局
- activity_main.xml
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
- item.xml
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="子布局" />
代码部分1
首先必须要设置一个LayoutManager
recyclerView.setLayoutManager();
这个LayoutManager有三种模式 :
1.线性流模式 : LinearLayoutManager
2.网格流模式 : GridLayoutManager
3.瀑布流模式 : StaggerGridLayoutManager
- 如果是 LinearLayoutManager 模式 :
//可以通过下面方法设置垂直或者水平
linearLayoutManager.setOrientation(OrientationHelper.VERTICAL);
linearLayoutManager.setOrientation(OrientationHelper.HORIZONTAL);
- 如果是 GridLayoutManager 模式 :
//2表示一排显示2个网格,如果是3,一排就显示3个网格
GridLayoutManager gridLayoutManager = new GridLayoutManager(getContext(),2);
//这个是设置当第几排时,占用多少个网格,从0开始
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
if (position == 0){
return 2; //当第1排时,占用2个网格(意思是第1排只有一整排)
}
if (position == 3){
return 2; //当第3排时,占用2个网格(意思是第3排只有一整排)
}
return 1; //其他排占用1个网格(意思是其他都是两两一排)
}
});
- 如果是StaggerGridLayoutManager模式 :
待定,没有玩过...
代码部分2
然后就需要一个Adapter继承下面这个自带VIewHolder的Adapter
RecyclerView.Adapter<RecyclerView.ViewHolder> 最好有几个item就在Adapter里面写几个 int 型的 ITEM 比如 : private static final int ITEM_1 = 1 , ITEM_2 = 2 , ITEM_3 = 3 , ITEM_4 = 4;
重写里面重要的四个方法
//创建子布局的方法,有几个item就需要返回几个不同的ViewHolder
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){...}
//绑定item的ViewHolder的方法,可以在此方法里查找item里的控件
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position){...}
//确定返回总共有多少个item
@Override
public int getItemCount(){...}
//可以根据不同的type来确定当多少行的时候,返回什么类型的item
@Override
public int getItemViewType(int position){...}
onCreateViewHolder方法简写 :
View view = null;
switch (viewType){
case ITEM_1:
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item1,parent,false);
return new Holder1(view);
case ITEM_2:
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item2,parent,false);
return new Holder2(view);
//此方法里也可以查找控件,设置监听
//mImageView = (ImageView) view.findViewById(R.id.img);
//mImageView1.setOnClickListener();
onBindViewHolder方法简写 :
if (holder instanceof Holder1){
Holder1 holder1 = (Holder1) holder;
//里面写逻辑代码
if (holder instanceof Holder2){
Holder2 holder2 = (Holder2) holder;
//里面写逻辑代码
getItemViewType方法简写 :
if (position == 0){
return ITEM_2;
}
if (position == 2){
return ITEM_1;
}
if (position == 3){
return ITEM_2;
}
return ITEM_1;