布局管理器显示不同跨度:
实用RecyclerView必须设置一个布局管理器,这里设置GridLayoutManager,还需要给布局管理器设置一个方法;
//设置表格,根据position计算在该position处item的跨度(占几列数据)
layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
//计算在哪个position更换跨度,要占满一行跨度就是2
if (position < type1Names.length)
return 2;
else //不需要占满一行跨度就是1
return 1;
}
});
适配器:
public class MyRecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private final MainActivity context;
private final List<TypeBean> typeBeanList;
private final int breakPoint;
public MyRecyclerAdapter(MainActivity mainActivity, List<TypeBean> typeBeanList, int breakPoint) {
this.context = mainActivity;
this.typeBeanList = typeBeanList;
this.breakPoint = breakPoint;
}
@Override
//判断是加载那个布局
public int getItemViewType(int position) {
if (position < breakPoint) {
return 0;
} else {
return 1;
}
}
@Override
//返回一个自定义的ViewHolder(当RecyclerView需要一个ViewHolder时会回调该方法,如果有可复用的View不会回调)
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view;
RecyclerView.ViewHolder holder = null;
switch (viewType) {
case 0:
view = LayoutInflater.from(context).inflate(R.layout.item_recycler_type1, parent, false);
holder = new Type1ViewHolder(view);
break;
case 1:
view = LayoutInflater.from(context).inflate(R.layout.item_recycler_type2, parent, false);
holder = new Type2ViewHolder(view);
break;
}
return holder;
}
@Override
//当一个View需要出现在屏幕上时,该方法会被回调,我们需要再该方法中根据数据来更改视图
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
TypeBean typeBean = typeBeanList.get(position);
switch (getItemViewType(position)) {
case 0:
Type1ViewHolder holder1 = (Type1ViewHolder) holder;
holder1.tvName.setText(typeBean.getName());
holder1.tvId.setText(typeBean.getId() + "");
break;
case 1:
Type2ViewHolder holder2 = (Type2ViewHolder) holder;
holder2.tvName.setText(typeBean.getName());
holder2.tvId.setText(typeBean.getId() + "");
if (position % 2 == 1)
holder2.fgxView.setVisibility(View.GONE);
else
holder2.fgxView.setVisibility(View.VISIBLE);
break;
}
}
@Override
//一共多少item
public int getItemCount() {
return typeBeanList.size();
}
//布局1
public class Type1ViewHolder extends RecyclerView.ViewHolder {
public TextView tvName, tvId;
public Type1ViewHolder(View itemView) {
super(itemView);
tvName = itemView.findViewById(R.id.tv_name);
tvId = itemView.findViewById(R.id.tv_id);
}
}
//布局2
public class Type2ViewHolder extends RecyclerView.ViewHolder {
public TextView tvName, tvId;
public View fgxView;
public Type2ViewHolder(View itemView) {
super(itemView);
tvName = itemView.findViewById(R.id.tv_name);
tvId = itemView.findViewById(R.id.tv_id);
fgxView = itemView.findViewById(R.id.fgx_view);
}
}
}
当adapter没有内容时,需要显示一个“空布局”页面,现在很多项目中都会用到;以前是根据数据是否为null来显示隐藏RecyclerView和空布局,其实可以自己封装一下,在RecyclerView中添加一个方法即可:
/**
* @param emptyView 空界面显示的控件
* @param view 显示状态与RecycleView一致的View
*/
private void checkIfEmpty(View emptyView, View... view) {
//获取adapter下面item的个数
final boolean emptyViewVisible = getAdapter().getItemCount() == 0;
if (getAdapter() == null) return;
//如果item=0空布局显示,否则隐藏
if (emptyView != null)
emptyView.setVisibility(emptyViewVisible ? VISIBLE : GONE);
//如果item=0布局数组隐藏,否则显示
if (view != null)
for (View v : view) {
if (v != null)
v.setVisibility(emptyViewVisible ? GONE : VISIBLE);
}
//如果item=0隐藏EmptyRecyclerView,否则显示
setVisibility(emptyViewVisible ? GONE : VISIBLE);
}
使用方法非常简单,在RecyclerView设置adapter之后添加:
View view=View.inflate(MainActivity.this,R.layout.include_empty,null);
/**
* 设置空布局
* 第一个参数:当数据清空时显示的布局
* 第二个参数:后可添加多个布局,当数据清空时一起隐藏的布局
*/
mRecyclerView.setEmptyView(view,tvHeader);