项目中需要实现微信钱包页面类似的布局,我第一次看到后觉得很容易,用recyclerview嵌套grideview就能实现,往回一想太麻烦,
并且要写好多adapter和相应的点击事件。于是我想能不能只用recyclerview不嵌套能不能实现。在网上搜到一个神奇的方法解决了我的问题LayoutManager.setSpanSizeLookup(SpanSizeLookup loopup)
private void initView() {
recycleView = (RecyclerView) findViewById(R.id.recycleView);
GridLayoutManager manager = new GridLayoutManager(this,3, LinearLayoutManager.VERTICAL,false);
MyAdapter adapter = new MyAdapter(list);
recycleView.setAdapter(adapter);
manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
return list.get(position).spanCount;
}
});
recycleView.setLayoutManager(manager);
}
例如我LayoutManager设置为GrideLayoutManager spancount设置为3 oritiation为vertical,每个item的spanSize为1,每个小标题的spansize为3,这个getSpanSize(int positon)方法返回的值为
3,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,在需要标题的地方返回3,item返回1
效果如下
上面的核心代码已经贴出,Adapter代码如下
public class MyAdapter extends RecyclerView.Adapter {
private List<GrideData> list;
public MyAdapter(List<GrideData> list) {
this.list = list;
}
@Override
public int getItemViewType(int position) {
return list.get(position).viewType;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == GrideData.TYPE_GRIDE) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.gride_item, parent,false);
GrideHolder holder = new GrideHolder(view);
return holder;
} else {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.linear_itme, parent,false);
LinearHolder holder = new LinearHolder(view);
return holder;
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
GrideData grideData = list.get(position);
if (grideData.viewType == GrideData.TYPE_GRIDE) {
GrideHolder holder1 = (GrideHolder) holder;
holder1.setText(position+"--");
} else {
LinearHolder holder1 = (LinearHolder) holder;
holder1.setText(position+"++");
}
}
@Override
public int getItemCount() {
return list.size();
}
public static class GrideHolder extends RecyclerView.ViewHolder{
TextView textView;
public GrideHolder(View itemView) {
super(itemView);
textView = (TextView) itemView.findViewById(R.id.textView);
}
public void setText(String text) {
textView.setText(text);
}
}
public static class LinearHolder extends RecyclerView.ViewHolder{
TextView textView;
public LinearHolder(View itemView) {
super(itemView);
textView = (TextView) itemView.findViewById(R.id.textView);
}
public void setText(String text) {
textView.setText(text);
}
}
}
bean代码
public class GrideData {
public static final int TYPE_LINEAR = 0;
public static final int TYPE_GRIDE = 1;
public int viewType = 1,spanCount=1;
public String data;
public GrideData(int viewType, String data) {
this.viewType = viewType;
this.data = data;
if (viewType == TYPE_GRIDE) {
spanCount = 1;
} else {
spanCount = 3;
}
}
}
Activity
public class MainActivity extends AppCompatActivity {
private RecyclerView recycleView;
private List<GrideData> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test_mutify_grideview);
initData();
initView();
}
public void initData() {
list = new ArrayList<>();
for (int i=0;i<30;i++) {
if (i == 0 || i==6 || i==20) {
list.add(new GrideData(TYPE_LINEAR, i + ""));
} else {
list.add(new GrideData(TYPE_GRIDE, i + ""));
}
}
}
private void initView() {
recycleView = (RecyclerView) findViewById(R.id.recycleView);
GridLayoutManager manager = new GridLayoutManager(this,3, LinearLayoutManager.VERTICAL,false);
MyAdapter adapter = new MyAdapter(list);
recycleView.setAdapter(adapter);
manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
return list.get(position).spanCount;
}
});
recycleView.setLayoutManager(manager);
}
}
好了,尽情的开撸吧!