RecyclerView是android 5.0之后的一个新特性控件,用起来很强大,它代替了已有的ListView,
RecyclerView可以实现ListView的效果,GridView的效果,还可以实现瀑布流。
问题:
1、如何给RecyclerView添加头部文件,
2、如何让RecyclerView显示不同的样式
大家在使用ListView的时候可以很轻松的添加headers, 但是不知道大家发现没有,RecyclerView和各种LayoutManager都没有哪个方法是为添加header而设立的,这个时候我们就开始思考如何为RecyclerView添加header了。 这里我们的解决方案和网上你能搜到的大多数方案一样,是通过控制Adapter的itemType来设置的,思路就是根据不同的itemType去加载不同的布局。
public class RecyclerWrapAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
public static final int TYPE_HEADER = 0;
public static final int TYPE_NORMAL = 1;
private ArrayList<DetailsInfo> mDatas = new ArrayList<>();
private View mHeaderView;
public void setmHeaderView(View mHeaderView) {
this.mHeaderView = mHeaderView;
notifyDataSetChanged();
}
this.mHeaderView = mHeaderView;
notifyDataSetChanged();
}
public View getmHeaderView() {
return mHeaderView;
}
return mHeaderView;
}
public void addDatas(ArrayList<DetailsInfo> datas) {
mDatas.addAll(datas);
notifyDataSetChanged();
}
@Override
public int getItemViewType(int position) {
if (mHeaderView == null) return TYPE_NORMAL;
if (position == 0) return TYPE_HEADER;
return TYPE_NORMAL;
}
public int getItemViewType(int position) {
if (mHeaderView == null) return TYPE_NORMAL;
if (position == 0) return TYPE_HEADER;
return TYPE_NORMAL;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (mHeaderView != null && viewType == TYPE_HEADER) return new Holder(mHeaderView);
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.detalis_layout_item, null);
return new Holder(view);
}
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (mHeaderView != null && viewType == TYPE_HEADER) return new Holder(mHeaderView);
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.detalis_layout_item, null);
return new Holder(view);
}
class Holder extends RecyclerView.ViewHolder {
TextView bossName, detallisNumber, detalisTime, detalisType, detalisSate;
TextView bossName, detallisNumber, detalisTime, detalisType, detalisSate;
public Holder(View itemView) {
super(itemView);
bossName = (TextView) itemView.findViewById(R.id.bossName);
detallisNumber = (TextView) itemView.findViewById(R.id.detallisNumber);
detalisTime = (TextView) itemView.findViewById(R.id.detalisTime);
detalisType = (TextView) itemView.findViewById(R.id.detalisType);
detalisSate = (TextView) itemView.findViewById(R.id.detalisSate);
}
}
super(itemView);
bossName = (TextView) itemView.findViewById(R.id.bossName);
detallisNumber = (TextView) itemView.findViewById(R.id.detallisNumber);
detalisTime = (TextView) itemView.findViewById(R.id.detalisTime);
detalisType = (TextView) itemView.findViewById(R.id.detalisType);
detalisSate = (TextView) itemView.findViewById(R.id.detalisSate);
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (getItemViewType(position) == TYPE_HEADER) return;
final int pos = getRealPosition(holder);
final DetailsInfo data = mDatas.get(pos);
if (holder instanceof Holder) {
Holder holder1s = (Holder) holder;
holder1s.bossName.setText(data.getClientId());
holder1s.detalisSate.setText(data.getDetailsState());
holder1s.detalisType.setText(data.getDetailsType());
holder1s.detalisTime.setText(data.getOrdersTime());
holder1s.detallisNumber.setText(data.getDetailsNumber());
}
}
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (getItemViewType(position) == TYPE_HEADER) return;
final int pos = getRealPosition(holder);
final DetailsInfo data = mDatas.get(pos);
if (holder instanceof Holder) {
Holder holder1s = (Holder) holder;
holder1s.bossName.setText(data.getClientId());
holder1s.detalisSate.setText(data.getDetailsState());
holder1s.detalisType.setText(data.getDetailsType());
holder1s.detalisTime.setText(data.getOrdersTime());
holder1s.detallisNumber.setText(data.getDetailsNumber());
}
}
public void UpDateDetalis(ArrayList<DetailsInfo> infos) {
if (infos != null) {
this.mDatas = infos;
}
notifyDataSetChanged();
}
if (infos != null) {
this.mDatas = infos;
}
notifyDataSetChanged();
}
public int getRealPosition(RecyclerView.ViewHolder holder) {
int position = holder.getLayoutPosition();
return mHeaderView == null ? position : position - 1;
}
int position = holder.getLayoutPosition();
return mHeaderView == null ? position : position - 1;
}
@Override
public int getItemCount() {
return mHeaderView == null ? mDatas.size() : mDatas.size() + 1;
}
public int getItemCount() {
return mHeaderView == null ? mDatas.size() : mDatas.size() + 1;
}
}
这里我们重写了getItemViewType方法,并根据位置来返回不同的type,这个type是我们预先商定好的常量,接在onCreateViewHolder方法中来判断itemType,如果是header,则返回我们设置的headerView,否则正常加载item布局,相信大家对于上面的代码不会有任何疑问,接下来我们就在Fragment中用一下试试看:
mLayoutManager = new LinearLayoutManager( this , LinearLayoutManager.VERTICAL, false ); mRecyclerView.setLayoutManager(mLayoutManager); mRecyclerView.setItemAnimator( new DefaultItemAnimator()); mAdapter = new MyAdapter(); mRecyclerView.setAdapter(mAdapter); mAdapter.addDatas(generateData()); setHeader(mRecyclerView); mAdapter.setOnItemClickListener( new MyAdapter.OnItemClickListener() { @Override public void onItemClick( int position, String data) { Toast.makeText(MainActivity. this , data, Toast.LENGTH_SHORT).show(); } });
private void setHeader(RecyclerView view) { View header = LayoutInflater.from(this).inflate(R.layout.header, view, false); mAdapter.setHeaderView(header); }上面添加了HeaderView 相信聪明的你,也已经学会了怎样去添加FooterView了吧!
下面我们再来看看如何给RecyclerView设置不同的样式
LinearLayoutManager manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL);
设置RecyclerView 为线性,垂直放下,最后还别忘了添加一句代码RecyclerView.setLayoutManager(manager);RecyclerView.setadapter(adapter);瀑布流显示:StaggeredGridLayoutManager manager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL)); //垂直方向显示 每行显示2个RecyclerView.setLayoutManager(manager);RecyclerView.setadapter(adapter);表格显示:
GridLayoutManager girdLayoutManager=new GridLayoutManager(this,4);每行显示四个
RecyclerView .setLayoutManager(girdLayoutManager);RecyclerView.setadapter(adapter);