失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 【RecyclerView】 十四 GridLayoutManager 网格布局管理器 ( GridLayoutManager.

【RecyclerView】 十四 GridLayoutManager 网格布局管理器 ( GridLayoutManager.

时间:2022-06-09 21:26:01

相关推荐

【RecyclerView】 十四 GridLayoutManager 网格布局管理器 ( GridLayoutManager.

文章目录

一、修改单条数据二、完整代码示例三、总体运行效果四、RecyclerView 相关资料

一、修改单条数据

GridLayoutManager.SpanSizeLookup 的主要作用是设置每个 item 元素占据网格布局的格子数量 ;

默认每个 item 元素占 1 个格子 ;

GridLayoutManager.SpanSizeLookup 使用流程 :

① 自定义类 :自定义 GridLayoutManager.SpanSizeLookup 子类 , 并实现 public int getSpanSize(int position) 方法 ;

② 设置占用格子数目 :设置元素在 getSpanSize 方法中 , 设置每个 position 位置占据的格子数量 ;

③ 布局管理器设置 :调用 setSpanSizeLookup 方法 , 将 GridLayoutManager.SpanSizeLookup 子类对象设置给 GridLayoutManager ;

④ 刷新 UI :调用 RecyclerView.Adapter 的 notifyDataSetChanged 方法即可刷新 UI ;

设置效果一 :第一个元素占 4 个格子 , 第二个元素占 2 个格子 , 第三个元素占 2 个格子 ;

// 设置网格每个位置的元素 占用格子个数layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {@Overridepublic int getSpanSize(int position) {// 第一个元素占 4 个格子if(position == 0){return 4;}// 第二个元素占 2 个格子if(position == 1){return 2;}// 第三个元素占 2 个格子if(position == 2){return 2;}return 1;}});

设置效果二 :每个元素都占用 2 个格子 ;

new GridLayoutManager.SpanSizeLookup() {@Overridepublic int getSpanSize(int position) {// 每个位置的元素都占用 2 个格子return 2;}}

设置效果三 :偶数位置占 1 个格子 , 奇数位置占 2 个格子 ;

new GridLayoutManager.SpanSizeLookup() {@Overridepublic int getSpanSize(int position) {if (position % 2 == 0){// 偶数位置占 1 个格子return 1;}else if (position % 2 == 1) {// 奇数位置占 3 个格子return 3;}return 1;}}

二、完整代码示例

package kim.hsl.recyclerview;import android.graphics.Color;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.TextView;import androidx.annotation.NonNull;import androidx.appcompat.app.AppCompatActivity;import androidx.recyclerview.widget.GridLayoutManager;import androidx.recyclerview.widget.RecyclerView;import androidx.recyclerview.widget.StaggeredGridLayoutManager;import java.util.ArrayList;public class MainActivity extends AppCompatActivity {/*** 数据源*/private ArrayList<String> names = new ArrayList<String>();/*** 当前的 RecyclerView 列表*/private RecyclerView recycler_view;/*** 网格布局管理器*/private GridLayoutManager layoutManager;/*** 适配器*/private Adapter adapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 初始化数据initData();//1 . 从布局中获取 RecyclerViewrecycler_view = findViewById(R.id.recycler_view);//2 . 创建并设置布局管理器//创建布局管理器layoutManager = new GridLayoutManager(this,4,RecyclerView.VERTICAL,false);// 设置网格每个位置的元素 占用格子个数layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {@Overridepublic int getSpanSize(int position) {// 第一个元素占 4 个格子if(position == 0){return 4;}// 第二个元素占 2 个格子if(position == 1){return 2;}// 第三个元素占 2 个格子if(position == 2){return 2;}return 1;}});//设置布局管理器recycler_view.setLayoutManager(layoutManager);// 设置边距recycler_view.addItemDecoration(new ItemDecoration());//3 . 创建并设置列表适配器adapter = new Adapter();recycler_view.setAdapter(adapter);// 初始化点击事件initClick();}/*** 初始化数据*/private void initData(){names.add("宋江");names.add("卢俊义");names.add("吴用");names.add("公孙胜");names.add("关胜");names.add("林冲");names.add("秦明");names.add("呼延灼");names.add("花荣");names.add("柴进");names.add("李应");names.add("朱仝");names.add("鲁智深");names.add("武松");names.add("董平");names.add("张清");names.add("杨志");names.add("徐宁");names.add("索超");}void initClick(){// 模式 1findViewById(R.id.mod_1).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {@Overridepublic int getSpanSize(int position) {// 每个位置的元素都占用 2 个格子return 2;}});// 重新刷新布局adapter.notifyDataSetChanged();}});// 模式 2findViewById(R.id.mod_2).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 给网格布局管理器设置新的layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {@Overridepublic int getSpanSize(int position) {if (position % 2 == 0){// 偶数位置占 1 个格子return 1;}else if (position % 2 == 1) {// 奇数位置占 3 个格子return 3;}return 1;}});// 重新刷新布局adapter.notifyDataSetChanged();}});}/*** RecyclerView 适配器*/public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> {@Overridepublic ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {View root_view = LayoutInflater.from(MainActivity.this).inflate(R.layout.item_recyclerview, parent, false);return new ViewHolder(root_view);}@Overridepublic void onBindViewHolder(@NonNull ViewHolder holder, int position) {holder.text.setText("" + names.get(position));}@Overridepublic int getItemCount() {return names.size();}public class ViewHolder extends RecyclerView.ViewHolder {TextView text;public ViewHolder(@NonNull View itemView) {super(itemView);text = itemView.findViewById(R.id.text);}}}}

三、总体运行效果

四、RecyclerView 相关资料

官方文档 :

使用 RecyclerView 创建动态列表 :https://developer./guide/topics/ui/layout/recyclerview

高级 RecyclerView 自定义 :https://developer./guide/topics/ui/layout/recyclerview-custom

RecyclerView 官方文档 :https://developer./reference/androidx/recyclerview/widget/RecyclerView

RecyclerView.Adapter 官方文档 :https://developer./reference/androidx/recyclerview/widget/RecyclerView.Adapter

RecyclerView.ViewHolder 官方文档 :https://developer./reference/androidx/recyclerview/widget/RecyclerView.ViewHolder

RecyclerView.ItemDecoration 官方文档 :https://developer./reference/androidx/recyclerview/widget/RecyclerView.ItemDecoration

GridLayoutManager 官方文档 :https://developer./reference/androidx/recyclerview/widget/GridLayoutManager

LinearLayoutManager 官方文档 :https://developer./reference/androidx/recyclerview/widget/LinearLayoutManager

StaggeredGridLayoutManager 官方文档 :https://developer./reference/androidx/recyclerview/widget/StaggeredGridLayoutManager

代码示例 :

GitHub 源码地址 :/han120/001_RecyclerView

博客源码快照 :/download/han120/15006329

( 使用 Android Studio 打开 )

【RecyclerView】 十四 GridLayoutManager 网格布局管理器 ( GridLayoutManager.SpanSizeLookup 指定 item 元素占用网格个数 )

如果觉得《【RecyclerView】 十四 GridLayoutManager 网格布局管理器 ( GridLayoutManager.》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。