介绍
如果让 RecyclerView 实现 1 个网格布局的运行效果,就需要使用 GridLayoutManager 类也就是网格布局管理器。GridLayoutManager 就像 GridView 一样,需要设置网格的列数才可以正常的显示。
相关方法
GridLayoutManager 可以通过构造方法指定网格的列数,也可以通过以下的两种方法来设置网格的列数,具体方法如下:
- setSpanCount:设置网格的列数。
- setSpanSizeLookup: 设置网格 item(子项)所占有的位置,默认为 1 项占 1 列,也可以通过GridLayoutManager.SpanSizeLookup 类中的方法设置某个 item(子项)占用多个列。
例子
RecyclerView的网格布局
编写布局文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!--列表控件-->
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerview"
android:background="#EEEEEE"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" />
</RelativeLayout>
创建layout_item02.xml?
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<!--显示图片-->
<ImageView
android:id="@+id/icon"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_gravity="center_horizontal" />
<!--显示图片的标题-->
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:textSize="17sp" />
</LinearLayout>
创建GridAdapter.java
public class GridAdapter extends RecyclerView.Adapter<GridAdapter.MyViewHolder> {
//图标数组
private int[] icons = {
R.drawable.img01, R.drawable.img02, R.drawable.img03,
R.drawable.img04, R.drawable.img05, R.drawable.img06,
R.drawable.img07, R.drawable.img08, R.drawable.img09,
R.drawable.img10, R.drawable.img11
};
//名字数组,引用资源文件中的文字
private int[] names = {
R.string.name1, R.string.name2, R.string.name3,
R.string.name4, R.string.name5, R.string.name6,
R.string.name7, R.string.name8, R.string.name9,
R.string.name10, R.string.name11
};
private Context lContext; //上下文
private List<Integer> listIcon = new ArrayList<Integer>(); //图标集合
private List<Integer> listName = new ArrayList<Integer>(); //名称集合
public GridAdapter(Context context) {
lContext = context;
//设置菜单行数与行内图标、名称、信息
for (int i = 0; i < 11; i++) {
listIcon.add(icons[i]);
listName.add(names[i]);
}
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//获取列表中每行的布局文件
View view = LayoutInflater.from(lContext).inflate(R.layout.layout_item02, parent, false);
MyViewHolder holder = new MyViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
//设置图标
holder.img.setBackgroundResource(listIcon.get(position));
//设置名称
holder.name.setText(listName.get(position));
}
@Override
public int getItemCount() {
return listIcon.size();
}
class MyViewHolder extends RecyclerView.ViewHolder {
public TextView name; //名字与信息
public ImageView img; //图标
//获取相关控件
public MyViewHolder(View itemView) {
super(itemView);
name = (TextView) itemView.findViewById(R.id.name);
img = (ImageView) itemView.findViewById(R.id.img);
}
}
}
编写GridRecyclerActivity
public class GridRecyclerActivity extends AppCompatActivity {
private RecyclerView gRecyclerView; //列表控件
private GridAdapter gridAdapter; //适配器
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_grid_recycler);
gRecyclerView = (RecyclerView) findViewById(R.id.recyclerview);
//创建网格布局管理器
GridLayoutManager manager = new GridLayoutManager(this, 2);
//设置网格列表中第1个与第2个item(子项)跨列每个子项占两个位置
manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
if (position == 0 ) { //判断是第1个或者第2个子项
return 2; //返回要跨的列数
} else {
return 1;
}
}
});
//设置网格布局管理器
gRecyclerView.setLayoutManager(manager);
//设置适配器
gridAdapter = new GridAdapter(this);
gRecyclerView.setAdapter(gridAdapter);
}
}
效果
|