RecyclerView是一个高度可定制性的View
本文将使用RecyclerView实现带header的grid
为了用RecyclerView创建一个带header的grid:
1,定义一个具有两种view类型的adapter,一个为header,一个为普通item。
2,nflate一个header,把它传递给adapter。
3,重写GridLayoutManager中的setSpanSizeLookup,在header所处的位置返回和span count (列数)相等的 span size。
import java.util.ArrayList;
import java.util.List;
import com.example.test.R;
import com.widget.view.HeaderAdapter.ViewHolder;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
/**
* 为了用RecyclerView创建一个带header的grid:
1,定义一个具有两种view类型的adapter,一个为header一个为普通item。
2,inflate一个header,把它传递给adapter。
3,重写GridLayoutManager中的setSpanSizeLookup,在header所处的位置返回和span count(列数)相等的 span size。
* @author Administrator
*
*/
public class HeaderAdapter extends RecyclerView.Adapter<ViewHolder> {
private static final int ITEM_VIEW_TYPE_HEADER = 0;
private static final int ITEM_VIEW_TYPE_ITEM = 1;
private final View header;
private final List<String> labels;
public HeaderAdapter(View header, int count) {
if (header == null) {
throw new IllegalArgumentException("header may not be null");
}
this.header = header;
this.labels = new ArrayList<String>(count);
for (int i = 0; i < count; ++i) {
labels.add(String.valueOf(i));
}
}
public boolean isHeader(int position) {
return position == 0;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == ITEM_VIEW_TYPE_HEADER) {
return new ViewHolder(header);
}
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
if (isHeader(position)) {
return;
}
final String label = labels.get(position - 1); // Subtract 1 for header
holder.textView.setText(label);
}
@Override
public int getItemViewType(int position) {
return isHeader(position) ? ITEM_VIEW_TYPE_HEADER : ITEM_VIEW_TYPE_ITEM;
}
@Override
public int getItemCount() {
return labels.size() + 1;
}
class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
public TextView textView;
public ViewHolder(View itemView) {
super(itemView);
if (onItemClickLitener != null){
itemView.setOnClickListener(this);
}
textView = (TextView) itemView.findViewById(R.id.item_0);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
onItemClickLitener.onItemClick(v, getLayoutPosition());//getPosition()被废弃了
}
}
private static OnItemClickLitener onItemClickLitener;
public void setOnItemClickLitener(OnItemClickLitener onItemClickLitener) {
this.onItemClickLitener = onItemClickLitener;
}
public interface OnItemClickLitener {
void onItemClick(View view, int position);
}
}
recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
View header = LayoutInflater.from(this).inflate(R.layout.header_view, recyclerView, false);
final HeaderAdapter adapter = new HeaderAdapter(header, 30);
adapter.setOnItemClickLitener(new HeaderAdapter.OnItemClickLitener() {
@Override
public void onItemClick(View view, int position) {
// TODO Auto-generated method stub
if(adapter.isHeader(position)){
Toast.makeText(context, "header clicked", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(context, "header item "+(position-1), Toast.LENGTH_SHORT).show();
}
}
});
final GridLayoutManager manager = new GridLayoutManager(this, 3);
manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
return adapter.isHeader(position) ? manager.getSpanCount() : 1;
}
});
recyclerView.setLayoutManager(manager);
recyclerView.setAdapter(adapter);
具体描述看原帖,我只是稍稍改了一下
http://www.open-open.com/lib/view/open1437662138631.html
如果你觉得使用RecyclerView添加Header比较烦,那没办法,就使用这个
HeaderGridView类吧
RecyclerView 必知必会
http://mp.weixin.qq.com/s/CzrKotyupXbYY6EY2HP_dA
分享到:
相关推荐
Android中Recyclerview使用5----添加头部:RecyclerViewHeader,这个功能在Android开发中,也是非常常用,所以我自己写了一个例子放到这,供大家下载,和大家交流
使用RecyclerView实现带Header和Footer的GridView
RecyclerView之添加header footer
recyclerView万能复用添加Header/FooterView及上拉加载下拉刷新源码
RecyclerViewHeader Super fast and easy way to create header for Android RecyclerView. Lets you create header View for any RecyclerView that uses LinearLayoutManager or GridLayoutManager with just a...
实际上, RecyclerViewHeader只是一个简单问题的复杂解决方案。 不用使用此库,只需学习如何创建多类型的RecyclerView.Adapter 。 从长远来看,它将为您带来很多价值,这一点也不难。 查看“ Migration部分,以获取...
无限轮播+RecyclerView添加Header
过去的两天,在项目中,抛弃了ListView, 想试一试RecyclerView, 在用的过程中,遇到了一些问题,比如:如何为RecyclerView添加Header和Footer? 如何为RecyclerView添加分割线?如何为RecyclerView添加下拉刷新和上拉...
使用RecyclerViewHeader一键添加RecyclerView头布局并实现轮播效果
配合博客:Android框架之路——Banner实现轮播图(RecyclerView添加Header)
博客:http://blog.csdn.net/qibin0506/article/details/49716795的代码
RecyclerView添加header ,添加footer同理
java餐饮管理源码 Android智能下拉刷新框架-SmartRefreshLayout ...View(AbsListView、RecyclerView、WebView....View) 支持自定义并且已经集成了很多炫酷的 Header 和 Footer. 支持和ListView的无缝同步
一个通用的header管理器,用法简便,其实主要目的是为了能自定义一个header,这个辅助用
RecyclerView添加Header和Footer.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
RecyclerView封装:加载更多,添加Header和Footer
ExpandableAdapter,继承自 RecyclerView.Adapter,支持header,child, group, groupchild, footer 分组,并且支持group悬浮效果(Sticky效果)。运行截图:示例代码:1.需要Group悬浮,将RecyclerView包裹在'...
Blog:http://blog.csdn.net/leejizhou/article/details/50742544
该库向垂直和水平 RecyclerView(对于所有 3 种内置类型——线性、交错网格、网格)添加页眉/页脚功能,并将 RecyclerView.Adapter 抽象到一个界面中,以便更轻松地使用多种 ViewHolder 类型。 依赖关系 App Compat ...