当前位置:   article > 正文

Android Studio App开发之循环试图RecyclerView,布局管理器LayoutManager、动态更新循环视图讲解及实战(附源码)_app:layoutmanager

app:layoutmanager

运行有问题或需要全部源码请点赞关注收藏后评论区留言~~~

一、循环视图RecyclerView

尽管ListView和GridView分别实现了多行单列和多行多列的列表,使用也很简单,可是它们缺少变化,风格也比较呆板,为此Android推出了更灵活多变的循环视图RecyclerView,它的功能非常强大 下面是它常用方法说明

1:setAdapter 设置列表项的循环适配器

2:setLayoutManager 设置列表项布局管理器

3:addItemDecoration  添加列表项的分割线

4:setItemAnimator 设置列表项的变更动画

5:scrollToPosition 滚动到指定位置

效果如下 仿照微信公众号的消息列表 

 

代码如下

Java类 

  1. package com.example.chapter12;
  2. import android.os.Bundle;
  3. import androidx.appcompat.app.AppCompatActivity;
  4. import androidx.recyclerview.widget.DefaultItemAnimator;
  5. import androidx.recyclerview.widget.LinearLayoutManager;
  6. import androidx.recyclerview.widget.RecyclerView;
  7. import com.example.chapter12.adapter.RecyclerLinearAdapter;
  8. import com.example.chapter12.bean.NewsInfo;
  9. import com.example.chapter12.widget.SpacesDecoration;
  10. public class RecyclerLinearActivity extends AppCompatActivity {
  11. @Override
  12. protected void onCreate(Bundle savedInstanceState) {
  13. super.onCreate(savedInstanceState);
  14. setContentView(R.layout.activity_recycler_linear);
  15. initRecyclerLinear(); // 初始化线性布局的循环视图
  16. }
  17. // 初始化线性布局的循环视图
  18. private void initRecyclerLinear() {
  19. // 从布局文件中获取名叫rv_linear的循环视图
  20. RecyclerView rv_linear = findViewById(R.id.rv_linear);
  21. // 创建一个垂直方向的线性布局管理器
  22. LinearLayoutManager manager = new LinearLayoutManager(this, RecyclerView.VERTICAL, false);
  23. rv_linear.setLayoutManager(manager); // 设置循环视图的布局管理器
  24. // 构建一个公众号列表的线性适配器
  25. RecyclerLinearAdapter adapter = new RecyclerLinearAdapter(this, NewsInfo.getDefaultList());
  26. rv_linear.setAdapter(adapter); // 设置循环视图的线性适配器
  27. rv_linear.setItemAnimator(new DefaultItemAnimator()); // 设置循环视图的动画效果
  28. rv_linear.addItemDecoration(new SpacesDecoration(1)); // 设置循环视图的空白装饰
  29. }
  30. }

XML文件

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="match_parent"
  3. android:layout_height="match_parent"
  4. android:orientation="vertical"
  5. android:padding="5dp">
  6. <androidx.recyclerview.widget.RecyclerView
  7. android:id="@+id/rv_linear"
  8. android:layout_width="match_parent"
  9. android:layout_height="wrap_content"
  10. android:background="#aaaaff" />
  11. </LinearLayout>

二、布局管理器LayoutManager

循环视图之所以能够变身为三种列表,是因为它允许指定不同的列表布局,这正是布局管理器LayoutManager的拿手好戏。分别有以下几种管理器 效果如下图

1:线性布局管理器

2:网格布局管理器

 

 

3:瀑布流网格布局管理器

电商App在展示众多商品信息时,往往通过高矮不一的格子展示,因为不同商品的外观尺寸不一样,所以若用一样规格的网格展示,必然有的商品会被压缩的很小,所以根据不同的商品形状展示不同高度的图片,就是瀑布流网格的应用场合

 代码如下

java类

  1. package com.example.chapter12;
  2. import android.os.Bundle;
  3. import androidx.appcompat.app.AppCompatActivity;
  4. import androidx.recyclerview.widget.DefaultItemAnimator;
  5. import androidx.recyclerview.widget.GridLayoutManager;
  6. import androidx.recyclerview.widget.RecyclerView;
  7. import com.example.chapter12.adapter.RecyclerGridAdapter;
  8. import com.example.chapter12.bean.NewsInfo;
  9. import com.example.chapter12.widget.SpacesDecoration;
  10. public class RecyclerGridActivity extends AppCompatActivity {
  11. @Override
  12. protected void onCreate(Bundle savedInstanceState) {
  13. super.onCreate(savedInstanceState);
  14. setContentView(R.layout.activity_recycler_grid);
  15. initRecyclerGrid(); // 初始化网格布局的循环视图
  16. }
  17. // 初始化网格布局的循环视图
  18. private void initRecyclerGrid() {
  19. // 从布局文件中获取名叫rv_grid的循环视图
  20. RecyclerView rv_grid = findViewById(R.id.rv_grid);
  21. // 创建一个网格布局管理器(每行5列)
  22. GridLayoutManager manager = new GridLayoutManager(this, 5);
  23. rv_grid.setLayoutManager(manager); // 设置循环视图的布局管理器
  24. // 构建一个市场列表的网格适配器
  25. RecyclerGridAdapter adapter = new RecyclerGridAdapter(this, NewsInfo.getDefaultGrid());
  26. adapter.setOnItemClickListener(adapter); // 设置网格列表的点击监听器
  27. adapter.setOnItemLongClickListener(adapter); // 设置网格列表的长按监听器
  28. rv_grid.setAdapter(adapter); // 设置循环视图的网格适配器
  29. rv_grid.setItemAnimator(new DefaultItemAnimator()); // 设置循环视图的动画效果
  30. rv_grid.addItemDecoration(new SpacesDecoration(1)); // 设置循环视图的空白装饰
  31. }
  32. }

瀑布流类代码

  1. package com.example.chapter12;
  2. import android.os.Bundle;
  3. import androidx.appcompat.app.AppCompatActivity;
  4. import androidx.recyclerview.widget.DefaultItemAnimator;
  5. import androidx.recyclerview.widget.RecyclerView;
  6. import androidx.recyclerview.widget.StaggeredGridLayoutManager;
  7. import com.example.chapter12.adapter.RecyclerStagAdapter;
  8. import com.example.chapter12.bean.NewsInfo;
  9. import com.example.chapter12.widget.SpacesDecoration;
  10. public class RecyclerStaggeredActivity extends AppCompatActivity {
  11. @Override
  12. protected void onCreate(Bundle savedInstanceState) {
  13. super.onCreate(savedInstanceState);
  14. setContentView(R.layout.activity_recycler_staggered);
  15. initRecyclerStaggered(); // 初始化瀑布流布局的循环视图
  16. }
  17. // 初始化瀑布流布局的循环视图
  18. private void initRecyclerStaggered() {
  19. // 从布局文件中获取名叫rv_staggered的循环视图
  20. RecyclerView rv_staggered = findViewById(R.id.rv_staggered);
  21. // 创建一个垂直方向的瀑布流布局管理器(每行3列)
  22. StaggeredGridLayoutManager manager = new StaggeredGridLayoutManager(
  23. 3, RecyclerView.VERTICAL);
  24. rv_staggered.setLayoutManager(manager); // 设置循环视图的布局管理器
  25. // 构建一个服装列表的瀑布流适配器
  26. RecyclerStagAdapter adapter = new RecyclerStagAdapter(this, NewsInfo.getDefaultStag());
  27. adapter.setOnItemClickListener(adapter); // 设置瀑布流列表的点击监听器
  28. adapter.setOnItemLongClickListener(adapter); // 设置瀑布流列表的长按监听器
  29. rv_staggered.setAdapter(adapter); // 设置循环视图的瀑布流适配器
  30. rv_staggered.setItemAnimator(new DefaultItemAnimator()); // 设置循环视图的动画效果
  31. rv_staggered.addItemDecoration(new SpacesDecoration(3)); // 设置循环视图的空白装饰
  32. }
  33. }

XML文件如下

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="match_parent"
  3. android:layout_height="match_parent"
  4. android:orientation="vertical">
  5. <androidx.recyclerview.widget.RecyclerView
  6. android:id="@+id/rv_staggered"
  7. android:layout_width="match_parent"
  8. android:layout_height="wrap_content"
  9. android:background="#ffffaa" />
  10. </LinearLayout>
  11. -----------------------
  12. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  13. android:layout_width="match_parent"
  14. android:layout_height="match_parent"
  15. android:padding="5dp"
  16. android:orientation="vertical">
  17. <androidx.recyclerview.widget.RecyclerView
  18. android:id="@+id/rv_grid"
  19. android:layout_width="match_parent"
  20. android:layout_height="wrap_content" />
  21. </LinearLayout>

三、动态更新循环视图

循环视图允许动态更新局部记录,既能对一条列表项单独添加修改,也能更新全部列表项,这种动态更新功能用到了循环适配器对象的下列方法

1:notifyItemInserted 通知适配器在指定位置插入了新项

2:notifyItemRemoved 通知适配器在指定位置删除了原有项

3:notifyItemChanged 通知适配器在指定位置发生了数据变化

4:notifyDataSetChanged 通知适配器整个列表的数据发生了变化

动态更新列表项只是在功能上的增强,在更新之时还能展示变更动画,这是循环视图在用户体验上的优化 效果如下

 

 代码如下

Java类

  1. package com.example.chapter12;
  2. import android.annotation.SuppressLint;
  3. import android.os.Bundle;
  4. import android.view.View;
  5. import android.widget.Toast;
  6. import androidx.appcompat.app.AppCompatActivity;
  7. import androidx.recyclerview.widget.DefaultItemAnimator;
  8. import androidx.recyclerview.widget.LinearLayoutManager;
  9. import androidx.recyclerview.widget.RecyclerView;
  10. import com.example.chapter12.adapter.LinearDynamicAdapter;
  11. import com.example.chapter12.bean.NewsInfo;
  12. import com.example.chapter12.widget.RecyclerExtras.OnItemClickListener;
  13. import com.example.chapter12.widget.RecyclerExtras.OnItemDeleteClickListener;
  14. import com.example.chapter12.widget.RecyclerExtras.OnItemLongClickListener;
  15. import com.example.chapter12.widget.SpacesDecoration;
  16. import java.util.List;
  17. import java.util.Random;
  18. @SuppressLint("DefaultLocale")
  19. public class RecyclerDynamicActivity extends AppCompatActivity implements View.OnClickListener
  20. , OnItemClickListener, OnItemLongClickListener, OnItemDeleteClickListener {
  21. private RecyclerView rv_dynamic; // 声明一个循环视图对象
  22. private LinearDynamicAdapter mAdapter; // 声明一个线性适配器对象
  23. private List<NewsInfo> mPublicList = NewsInfo.getDefaultList(); // 当前的公众号信息列表
  24. private List<NewsInfo> mOriginList = NewsInfo.getDefaultList(); // 原始的公众号信息列表
  25. @Override
  26. protected void onCreate(Bundle savedInstanceState) {
  27. super.onCreate(savedInstanceState);
  28. setContentView(R.layout.activity_recycler_dynamic);
  29. findViewById(R.id.btn_recycler_add).setOnClickListener(this);
  30. initRecyclerDynamic(); // 初始化动态线性布局的循环视图
  31. }
  32. // 初始化动态线性布局的循环视图
  33. private void initRecyclerDynamic() {
  34. // 从布局文件中获取名叫rv_dynamic的循环视图
  35. rv_dynamic = findViewById(R.id.rv_dynamic);
  36. // 创建一个垂直方向的线性布局管理器
  37. LinearLayoutManager manager = new LinearLayoutManager(
  38. this, RecyclerView.VERTICAL, false);
  39. rv_dynamic.setLayoutManager(manager); // 设置循环视图的布局管理器
  40. // 构建一个公众号列表的线性适配器
  41. mAdapter = new LinearDynamicAdapter(this, mPublicList);
  42. mAdapter.setOnItemClickListener(this); // 设置线性列表的点击监听器
  43. mAdapter.setOnItemLongClickListener(this); // 设置线性列表的长按监听器
  44. mAdapter.setOnItemDeleteClickListener(this); // 设置线性列表的删除按钮监听器
  45. rv_dynamic.setAdapter(mAdapter); // 设置循环视图的线性适配器
  46. rv_dynamic.setItemAnimator(new DefaultItemAnimator()); // 设置循环视图的动画效果
  47. rv_dynamic.addItemDecoration(new SpacesDecoration(1)); // 设置循环视图的空白装饰
  48. }
  49. @Override
  50. public void onClick(View v) {
  51. if (v.getId() == R.id.btn_recycler_add) {
  52. int position = new Random().nextInt(mOriginList.size()-1); // 获取一个随机位置
  53. NewsInfo old_item = mOriginList.get(position);
  54. NewsInfo new_item = new NewsInfo(old_item.pic_id, old_item.title, old_item.desc);
  55. mPublicList.add(0, new_item); // 在顶部添加一条公众号消息
  56. mAdapter.notifyItemInserted(0); // 通知适配器列表在第一项插入数据
  57. rv_dynamic.scrollToPosition(0); // 让循环视图滚动到第一项所在的位置
  58. }
  59. }
  60. // 一旦点击循环适配器的列表项,就触发点击监听器的onItemClick方法
  61. public void onItemClick(View view, int position) {
  62. String desc = String.format("您点击了第%d项,标题是%s", position + 1,
  63. mPublicList.get(position).title);
  64. Toast.makeText(this, desc, Toast.LENGTH_SHORT).show();
  65. }
  66. // 一旦长按循环适配器的列表项,就触发长按监听器的onItemLongClick方法
  67. public void onItemLongClick(View view, int position) {
  68. NewsInfo item = mPublicList.get(position);
  69. item.bPressed = !item.bPressed;
  70. mPublicList.set(position, item);
  71. mAdapter.notifyItemChanged(position); // 通知适配器列表在第几项发生变更
  72. }
  73. // 一旦点击循环适配器列表项的删除按钮,就触发删除监听器的onItemDeleteClick方法
  74. public void onItemDeleteClick(View view, int position) {
  75. mPublicList.remove(position);
  76. mAdapter.notifyItemRemoved(position); // 通知适配器列表在第几项删除数据
  77. }
  78. }

XML文件

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="match_parent"
  3. android:layout_height="match_parent"
  4. android:orientation="vertical">
  5. <Button
  6. android:id="@+id/btn_recycler_add"
  7. android:layout_width="match_parent"
  8. android:layout_height="wrap_content"
  9. android:text="增加新聊天"
  10. android:textColor="@color/black"
  11. android:textSize="17sp" />
  12. <androidx.recyclerview.widget.RecyclerView
  13. android:id="@+id/rv_dynamic"
  14. android:layout_width="match_parent"
  15. android:layout_height="wrap_content"
  16. android:layout_marginLeft="5dp"
  17. android:layout_marginRight="5dp"
  18. android:background="#aaaaff" />
  19. </LinearLayout>

创作不易 觉得有帮助请点赞关注收藏~~~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/174981
推荐阅读
相关标签
  

闽ICP备14008679号