我需要实现一个视图,顶部是一张图片,底部有一个包含两列的GridView
。因此,我计划使用RecyclerView
来实现它。对于顶部,我需要使用LinearLayoutManager
,底部则需要使用GridLayoutManager
。那么我要如何创建一个具备这两个值的Recycler适配器呢?
我需要实现一个视图,顶部是一张图片,底部有一个包含两列的GridView
。因此,我计划使用RecyclerView
来实现它。对于顶部,我需要使用LinearLayoutManager
,底部则需要使用GridLayoutManager
。那么我要如何创建一个具备这两个值的Recycler适配器呢?
假设您知道如何使用多个视图类型创建RecyclerView适配器,那么这就是您为RecyclerView指定布局管理器的方式。
mAdapter = new MyMultiViewAdapter(); // an imaginary adapter that supports multiple view types
mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
GridLayoutManager glm = new GridLayoutManager(this, 2);
glm.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
switch(mAdapter.getItemViewType(position)){
case MyAdapter.TYPE_HEADER:
return 2;
case MyAdapter.TYPE_ITEM:
return 1;
default:
return -1;
}
}
});
mRecyclerView.setLayoutManager(glm);
mRecyclerView.setAdapter(mAdapter);
RecyclerView
只能使用一个布局管理器。因此,为了实现您需要的效果,您需要使用GridLayoutManager
。
将span size设置为2,以获得两列。然后,您可以使用setSpanSizeLookup
将第一个项目标记为跨越两列。在这个视图中,您可以放置您的“顶部图片”。
public boolean isHeader(int position) {
return position == 0;
}
GridLayoutManager manager = new GridLayoutManager(this, 2);
manager.setSpanSizeLookup(new SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
return isHeader(position) ? 2 : 1;
}
});
recyclerView.setLayoutManager(manager);
接下来,onCreateViewHolder
方法可以根据该位置的项目类型返回不同的视图持有者。
@Override
public int getItemViewType(int position) {
return isHeader(position) ? VIEW_TYPE_HEADER : VIEW_TYPE_ITEM;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == VIEW_TYPE_HEADER) {
// Setup header view holder
return new HeaderViewHolder(...);
}
// Setup item view holder
return new ItemViewHolder(...)
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
if (isHeader(position)) {
return;
}
// Bind item to the item view holder
}