项目中需要实现微信钱包页面类似的布局,我第一次看到后觉得很容易,用recyclerview嵌套grideview就能实现,往回一想太麻烦,
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); } }好了,尽情的开撸吧!