1、Adapter中定义不同Item类型,复写getItemViewType方法
2、在onCreateViewHolder中根据viewType返回不同的ViewHolder
3、onBindViewHolder根据不同ViewHolder渲染内容
4、Activity中定义GridLayoutManager
5、复写GridLayoutManager.setSpanSizeLookup。
关键代码
Adapter
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
public static final int TYPE_LIST = 0, TYPE_GRID = 1;
private LayoutInflater inflater;
private List<String> datas = new ArrayList<>();
public MyAdapter(Context context) {
inflater = LayoutInflater.from(context);
String[] array = {"a", "a", "a", "a", "a", "a", "a", "a", "a", "a"};
datas.addAll(Arrays.asList(array));
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == TYPE_LIST) {
View view = inflater.inflate(R.layout.item_listview, parent, false);
ViewHolderList viewHolder = new ViewHolderList(view);
viewHolder.textView = (TextView) view.findViewById(R.id.tv);
return viewHolder;
} else {
View view = inflater.inflate(R.layout.item_gridview, parent, false);
ViewHolderGrid viewHolder = new ViewHolderGrid(view);
viewHolder.imageView = (ImageView) view.findViewById(R.id.iv_grid);
return viewHolder;
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder instanceof ViewHolderList) {
ViewHolderList viewHolder = (ViewHolderList) holder;
viewHolder.textView.setText(datas.get(position));
} else {
}
}
@Override
public int getItemCount() {
return datas.size();
}
@Override
public int getItemViewType(int position) {
return position < 5 ? TYPE_LIST : TYPE_GRID;
}
class ViewHolderList extends RecyclerView.ViewHolder {
private TextView textView;
public ViewHolderList(View itemView) {
super(itemView);
}
}
class ViewHolderGrid extends RecyclerView.ViewHolder {
private ImageView imageView;
public ViewHolderGrid(View itemView) {
super(itemView);
}
}
}
Activity代码:
mRecyclerView = (RecyclerView) findViewById(R.id.recycler);
adapter = new MyAdapter(this);
GridLayoutManager layoutManager = new GridLayoutManager(this, 2);
layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
switch (adapter.getItemViewType(position)) {
case MyAdapter.TYPE_LIST:
return 2;
case MyAdapter.TYPE_GRID:
return 1;
default:
return -1;
}
}
});
mRecyclerView.setLayoutManager(layoutManager);
mRecyclerView.setAdapter(adapter);