最近项目中需要一个类似微博个人信息页的布局,网上找了一些资料但都不符合自己的需求,故自己实现一个。
一.模仿布局样式原型:
上图是新浪微博个人信息页的整体布局,可以看到整个布局是一个可以滚动列表结构,上边是一个个人信息布局和一个tab选择栏布局,看到这个布局之后我们可以想到用scrollview+listview来完成,但由于使用这种嵌套方式之后需重写listview高度而导致item无法复用,故我们使用另一种方式来完成,也就是RecyclerView充当整个布局的方式,个人信息布局和tab选择栏作为header插入到列表中。
下边来让我们思考一下即将实现布局将会遇到的问题:
1.RecyclerView如何加header和footer进去?
2.怎样做到悬浮tab栏效果?
3.怎么在同一个列表中加载不同的样式?
4.如何在点tab栏切换数据的时候保持列表处于上一次的位置?
问题一:RecyclerView如何加header和footer进去?
我们都知道RecylerView不像Listview一样有addheaderview和addfooterview两个方法,既然没有这两个方法我们就需要自己去写这两个方法并且去实现了,我们知道RecyclerView的adapter中有一个叫getItemViewType(int position)的方法,我们可以通过重写这个方法来让RecyclerView的item根据条件不同加载不同种类的布局,那我们便可以通过重写这个方法将header和footer作为item项加入到RecyclerView中从而达到加header和footer的效果。适配器的代码如下:
package com.ifeng.art.common.widget.recyclerview;
import android.content.Context;
import android.support.v4.util.SparseArrayCompat;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import java.util.ArrayList;
import java.util.List;
/**
* Created by lvzishen on 16/10/8.
*/
public abstract class WrapperRecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
protected List list = new ArrayList<>();
protected Context context;
// /**
// * 头布局
// */
// private View headView;
// /**
// * 头布局Tab
// */
// private View headViewTab;
/**
* 头布局
* key: Integer; value: object
*/
private SparseArrayCompat<View> mHeaderViews = new SparseArrayCompat<>();
/**
* 头布局Tab
*/
private View headViewTab;
/**
* 脚布局
*/
private FooterView footView;
// /**
// * 头布局数量
// */
// public int headViewCount = 0;
/**
* 脚布局数量
*/
public int footViewCount = 0;
public int getFootViewCount() {
return footViewCount;
}
private static final int TYPE_HEADER = 1;
private static final int TYPE_FOOTER = 3;
private FootViewHolder footViewHolder;
public void setList(List listData) {
this.list.clear();
this.list.addAll(listData);
this.notifyDataSetChanged();
}
public WrapperRecyclerAdapter(Context context) {
this.context = context;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (mHeaderViews.get(viewType) != null) {
return new HeadViewHolder(mHeaderViews.get(viewType));
}
else