• 组合控件——增强型列表——循环视图RecyclerView——布局管理器LayoutManager


    RecyclerView的布局样式依赖于布局管理器LayoutManager,它提供了下面3类布局管理器。

    (1)线性布局管理器LinearLayoutManager

    该管理器可看作线性布局LinearLayout,在垂直方向布局时,展示效果类似于垂直的列表视图ListView;在水平方向布局时,展示效果类似于水平的列表视图。

    下面是LinearLayoutManager的常用方法。

    构造函数:可指定列表的方向和是否为相反方向开始布局。

    setOrientation :设置列表的方向。

    setReverseLayout :设置是否为相反方向开始布局,默认false。

    (2)网格布局管理器GridLayoutManager

    该管理器可看作网格布局GridLayout,其展示效果类似于网格视图GridView。

    GridLayout、GridView、GridLayoutManager都呈现多行多列的网格界面。

    下面是GridLayoutManager的常用方法。

    构造函数:可指定网格的列数。setSpanCount:设置网格的列数。setSpanSizeLookup:设置列表项的占位规则。

    (3)瀑布流网格布局管理器StaggeredGridLayoutManager

    该管理器允许使用灵活高度的格子展示每个视图,例如根据不同的商品形状展示不同高度的图片。

    下面是StaggeredGridLayoutManager的常用方法。

    构造函数:可指定网格的列数和方向。

    setSpanCount:设置网格的列数。setOrientation :设置列表的方向。setReverseLayout :设置是否为相反方向开始布局,默认false。

    =========================================================================================

    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:padding="5dp"
    5. android:orientation="vertical">
    6. <androidx.recyclerview.widget.RecyclerView
    7. android:id="@+id/rv_grid"
    8. android:layout_width="match_parent"
    9. android:layout_height="wrap_content" />
    10. </LinearLayout>

    主代码:

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

     

    NewsInfo
    
    1. package com.example.myapplication.bean;
    2. import com.example.myapplication.R;
    3. import java.util.ArrayList;
    4. import java.util.List;
    5. public class NewsInfo
    6. {
    7. public int pic_id; // 图片的资源编号
    8. public String title; // 标题
    9. public String desc; // 描述
    10. public boolean isPressed; // 是否按下
    11. public int id; // 商品信息编号
    12. private static int seq = 0; // 序号
    13. public NewsInfo(int pic_id, String title, String desc)
    14. {
    15. this.pic_id = pic_id;
    16. this.title = title;
    17. this.desc = desc;
    18. this.isPressed = false;
    19. this.id = this.seq;
    20. this.seq++;
    21. }
    22. private static int[] newsImageArray = {R.drawable.public_01, R.drawable.public_02
    23. , R.drawable.public_03, R.drawable.public_04, R.drawable.public_05};
    24. private static String[] newsTitleArray = {
    25. "首都日报", "海峡时报", "东方周末", "参照消息", "挨踢杂志"};
    26. private static String[] newsDescArray = {
    27. "北京冬奥精彩纷呈,中外健儿各显神通",
    28. "庆祝伟大统一,闽台两地合办中秋晚会",
    29. "日本新娘仰慕中土,纷纷跨海嫁往上海",
    30. "雅万高铁建成通车,中国标准再下一城",
    31. "Mate40大战iPhone12,两大豪机争上游"};
    32. public static List<NewsInfo> getDefaultList()
    33. {
    34. List<NewsInfo> newsList = new ArrayList<NewsInfo>();
    35. for (int i = 0; i < newsImageArray.length; i++) {
    36. newsList.add(new NewsInfo(newsImageArray[i], newsTitleArray[i], newsDescArray[i]));
    37. }
    38. return newsList;
    39. }
    40. private static int[] gridImageArray = {R.drawable.pic_01, R.drawable.pic_02, R.drawable.pic_03
    41. , R.drawable.pic_04, R.drawable.pic_05, R.drawable.pic_06, R.drawable.pic_07
    42. , R.drawable.pic_08, R.drawable.pic_09, R.drawable.pic_10};
    43. private static String[] gridTitleArray = {"商场", "超市", "百货", "便利店",
    44. "地摊", "食杂店", "饭店", "餐厅", "会所", "菜市场"};
    45. public static List<NewsInfo> getDefaultGrid() {
    46. List<NewsInfo> gridList = new ArrayList<NewsInfo>();
    47. for (int i = 0; i < gridImageArray.length; i++) {
    48. gridList.add(new NewsInfo(gridImageArray[i], gridTitleArray[i], null));
    49. }
    50. return gridList;
    51. }
    52. private static int[] stagImageArray = {R.drawable.skirt01, R.drawable.skirt02, R.drawable.skirt03
    53. , R.drawable.skirt04, R.drawable.skirt05, R.drawable.skirt06, R.drawable.skirt07
    54. , R.drawable.skirt08, R.drawable.skirt09, R.drawable.skirt10, R.drawable.skirt11
    55. , R.drawable.skirt12, R.drawable.skirt13, R.drawable.skirt14, R.drawable.skirt15
    56. , R.drawable.skirt16, R.drawable.skirt17, R.drawable.skirt18, R.drawable.skirt19
    57. , R.drawable.skirt20, R.drawable.skirt21, R.drawable.skirt22, R.drawable.skirt23};
    58. private static String[] stagTitleArray = {"促销价", "惊爆价", "跳楼价", "白菜价", "清仓价", "割肉价",
    59. "实惠价", "一口价", "满意价", "打折价", "腰斩价", "无人问津", "算了吧", "大声点",
    60. "嘘嘘", "嗯嗯", "呼呼", "呵呵", "哈哈", "嘿嘿", "嘻嘻", "嗷嗷", "喔喔"};
    61. public static List<NewsInfo> getDefaultStag() {
    62. List<NewsInfo> stagList = new ArrayList<NewsInfo>();
    63. for (int i = 0; i < stagImageArray.length; i++) {
    64. stagList.add(new NewsInfo(stagImageArray[i], stagTitleArray[i], null));
    65. }
    66. return stagList;
    67. }
    68. private static int[] combineImageArray = {R.drawable.cainixihuan, R.drawable.dapaijiadao
    69. , R.drawable.trip_01, R.drawable.trip_02, R.drawable.trip_03, R.drawable.trip_04};
    70. private static String[] combineTitleArray = {
    71. "猜你喜欢", "大牌驾到", "买哪个", "别想了", "先下单", "包你满意"};
    72. public static List<NewsInfo> getDefaultCombine() {
    73. List<NewsInfo> combineList = new ArrayList<NewsInfo>();
    74. for (int i = 0; i < combineImageArray.length; i++) {
    75. combineList.add(new NewsInfo(combineImageArray[i], combineTitleArray[i], null));
    76. }
    77. return combineList;
    78. }
    79. private static int[] appiImageArray = {R.drawable.dian01, R.drawable.dian02, R.drawable.dian03
    80. , R.drawable.dian04, R.drawable.dian05, R.drawable.dian06, R.drawable.dian07
    81. , R.drawable.dian08, R.drawable.dian09, R.drawable.dian10, R.drawable.dian11
    82. , R.drawable.dian12, R.drawable.dian13, R.drawable.dian14, R.drawable.dian15};
    83. private static String[] appiTitleArray = {"双十一", "大聚惠", "爆款价",
    84. "就一次", "手慢无", "快点击", "付定金", "享特权", "包安装", "再返券",
    85. "白送你", "想得美", "干活去", "好好学", "才有钱"};
    86. public static List<NewsInfo> getDefaultAppi() {
    87. List<NewsInfo> appiList = new ArrayList<NewsInfo>();
    88. for (int i = 0; i < appiImageArray.length; i++) {
    89. appiList.add(new NewsInfo(appiImageArray[i], appiTitleArray[i], null));
    90. }
    91. return appiList;
    92. }
    93. }

     

    RecyclerExtras
    
    1. package com.example.myapplication.widget;
    2. import android.view.View;
    3. public class RecyclerExtras
    4. {
    5. // 定义一个循环视图列表项的点击监听器接口
    6. public interface OnItemClickListener
    7. {
    8. void onItemClick(View view, int position);
    9. }
    10. // 定义一个循环视图列表项的长按监听器接口
    11. public interface OnItemLongClickListener
    12. {
    13. void onItemLongClick(View view, int position);
    14. }
    15. // 定义一个循环视图列表项的删除监听器接口
    16. public interface OnItemDeleteClickListener
    17. {
    18. void onItemDeleteClick(View view, int position);
    19. }
    20. }

    RecyclerGridAdapter
    
    1. package com.example.myapplication.adapter;
    2. import android.annotation.SuppressLint;
    3. import android.content.Context;
    4. import android.view.LayoutInflater;
    5. import android.view.View;
    6. import android.view.View.OnClickListener;
    7. import android.view.View.OnLongClickListener;
    8. import android.view.ViewGroup;
    9. import android.widget.ImageView;
    10. import android.widget.LinearLayout;
    11. import android.widget.TextView;
    12. import android.widget.Toast;
    13. import androidx.recyclerview.widget.RecyclerView;
    14. import androidx.recyclerview.widget.RecyclerView.ViewHolder;
    15. import com.example.myapplication.R;
    16. import com.example.myapplication.bean.NewsInfo;
    17. import com.example.myapplication.widget.RecyclerExtras.OnItemClickListener;
    18. import com.example.myapplication.widget.RecyclerExtras.OnItemLongClickListener;
    19. import java.util.List;
    20. @SuppressLint("DefaultLocale")
    21. public class RecyclerGridAdapter extends RecyclerView.Adapter implements
    22. OnItemClickListener, OnItemLongClickListener {
    23. private final static String TAG = "RecyclerGridAdapter";
    24. private Context mContext; // 声明一个上下文对象
    25. private List mGoodsList;
    26. public RecyclerGridAdapter(Context context, List goodsList) {
    27. mContext = context;
    28. mGoodsList = goodsList;
    29. }
    30. // 获取列表项的个数
    31. public int getItemCount() {
    32. return mGoodsList.size();
    33. }
    34. // 创建列表项的视图持有者
    35. public ViewHolder onCreateViewHolder(ViewGroup vg, int viewType) {
    36. // 根据布局文件item_grid.xml生成视图对象
    37. View v = LayoutInflater.from(mContext).inflate(R.layout.item_grid, vg, false);
    38. return new ItemHolder(v);
    39. }
    40. // 绑定列表项的视图持有者
    41. public void onBindViewHolder(ViewHolder vh, @SuppressLint("RecyclerView") final int position) {
    42. ItemHolder holder = (ItemHolder) vh;
    43. holder.iv_pic.setImageResource(mGoodsList.get(position).pic_id);
    44. holder.tv_title.setText(mGoodsList.get(position).title);
    45. // 列表项的点击事件需要自己实现
    46. holder.ll_item.setOnClickListener(new OnClickListener() {
    47. @Override
    48. public void onClick(View v) {
    49. if (mOnItemClickListener != null) {
    50. mOnItemClickListener.onItemClick(v, position);
    51. }
    52. }
    53. });
    54. // 列表项的长按事件需要自己实现
    55. holder.ll_item.setOnLongClickListener(new OnLongClickListener() {
    56. @Override
    57. public boolean onLongClick(View v) {
    58. if (mOnItemLongClickListener != null) {
    59. mOnItemLongClickListener.onItemLongClick(v, position);
    60. }
    61. return true;
    62. }
    63. });
    64. }
    65. // 获取列表项的类型
    66. public int getItemViewType(int position) {
    67. return 0;
    68. }
    69. // 获取列表项的编号
    70. public long getItemId(int position) {
    71. return position;
    72. }
    73. // 定义列表项的视图持有者
    74. public class ItemHolder extends RecyclerView.ViewHolder {
    75. public LinearLayout ll_item; // 声明列表项的线性布局
    76. public ImageView iv_pic; // 声明列表项图标的图像视图
    77. public TextView tv_title; // 声明列表项标题的文本视图
    78. public ItemHolder(View v) {
    79. super(v);
    80. ll_item = v.findViewById(R.id.ll_item);
    81. iv_pic = v.findViewById(R.id.iv_pic);
    82. tv_title = v.findViewById(R.id.tv_title);
    83. }
    84. }
    85. // 声明列表项的点击监听器对象
    86. private OnItemClickListener mOnItemClickListener;
    87. public void setOnItemClickListener(OnItemClickListener listener) {
    88. this.mOnItemClickListener = listener;
    89. }
    90. // 声明列表项的长按监听器对象
    91. private OnItemLongClickListener mOnItemLongClickListener;
    92. public void setOnItemLongClickListener(OnItemLongClickListener listener) {
    93. this.mOnItemLongClickListener = listener;
    94. }
    95. // 处理列表项的点击事件
    96. public void onItemClick(View view, int position) {
    97. String desc = String.format("您点击了第%d项,栏目名称是%s", position + 1,
    98. mGoodsList.get(position).title);
    99. Toast.makeText(mContext, desc, Toast.LENGTH_SHORT).show();
    100. }
    101. // 处理列表项的长按事件
    102. public void onItemLongClick(View view, int position) {
    103. String desc = String.format("您长按了第%d项,栏目名称是%s", position + 1,
    104. mGoodsList.get(position).title);
    105. Toast.makeText(mContext, desc, Toast.LENGTH_SHORT).show();
    106. }
    107. }

    item_grid.xml

    1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    2. android:id="@+id/ll_item"
    3. android:layout_width="match_parent"
    4. android:layout_height="wrap_content"
    5. android:background="@color/white"
    6. android:orientation="vertical">
    7. <ImageView
    8. android:id="@+id/iv_pic"
    9. android:layout_width="match_parent"
    10. android:layout_height="wrap_content"
    11. android:scaleType="fitCenter" />
    12. <TextView
    13. android:id="@+id/tv_title"
    14. android:layout_width="match_parent"
    15. android:layout_height="wrap_content"
    16. android:gravity="center"
    17. android:textColor="@color/black"
    18. android:textSize="17sp" />
    19. </LinearLayout>

    ================================================================================================

    瀑布流网格布局管理器

    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>

    主代码:

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

     

    NewsInfo
    
    1. package com.example.myapplication.bean;
    2. import com.example.myapplication.R;
    3. import java.util.ArrayList;
    4. import java.util.List;
    5. public class NewsInfo
    6. {
    7. public int pic_id; // 图片的资源编号
    8. public String title; // 标题
    9. public String desc; // 描述
    10. public boolean isPressed; // 是否按下
    11. public int id; // 商品信息编号
    12. private static int seq = 0; // 序号
    13. public NewsInfo(int pic_id, String title, String desc)
    14. {
    15. this.pic_id = pic_id;
    16. this.title = title;
    17. this.desc = desc;
    18. this.isPressed = false;
    19. this.id = this.seq;
    20. this.seq++;
    21. }
    22. private static int[] newsImageArray = {R.drawable.public_01, R.drawable.public_02
    23. , R.drawable.public_03, R.drawable.public_04, R.drawable.public_05};
    24. private static String[] newsTitleArray = {
    25. "首都日报", "海峡时报", "东方周末", "参照消息", "挨踢杂志"};
    26. private static String[] newsDescArray = {
    27. "北京冬奥精彩纷呈,中外健儿各显神通",
    28. "庆祝伟大统一,闽台两地合办中秋晚会",
    29. "日本新娘仰慕中土,纷纷跨海嫁往上海",
    30. "雅万高铁建成通车,中国标准再下一城",
    31. "Mate40大战iPhone12,两大豪机争上游"};
    32. public static List<NewsInfo> getDefaultList()
    33. {
    34. List<NewsInfo> newsList = new ArrayList<NewsInfo>();
    35. for (int i = 0; i < newsImageArray.length; i++) {
    36. newsList.add(new NewsInfo(newsImageArray[i], newsTitleArray[i], newsDescArray[i]));
    37. }
    38. return newsList;
    39. }
    40. private static int[] gridImageArray = {R.drawable.pic_01, R.drawable.pic_02, R.drawable.pic_03
    41. , R.drawable.pic_04, R.drawable.pic_05, R.drawable.pic_06, R.drawable.pic_07
    42. , R.drawable.pic_08, R.drawable.pic_09, R.drawable.pic_10};
    43. private static String[] gridTitleArray = {"商场", "超市", "百货", "便利店",
    44. "地摊", "食杂店", "饭店", "餐厅", "会所", "菜市场"};
    45. public static List<NewsInfo> getDefaultGrid() {
    46. List<NewsInfo> gridList = new ArrayList<NewsInfo>();
    47. for (int i = 0; i < gridImageArray.length; i++) {
    48. gridList.add(new NewsInfo(gridImageArray[i], gridTitleArray[i], null));
    49. }
    50. return gridList;
    51. }
    52. private static int[] stagImageArray = {R.drawable.skirt01, R.drawable.skirt02, R.drawable.skirt03
    53. , R.drawable.skirt04, R.drawable.skirt05, R.drawable.skirt06, R.drawable.skirt07
    54. , R.drawable.skirt08, R.drawable.skirt09, R.drawable.skirt10, R.drawable.skirt11
    55. , R.drawable.skirt12, R.drawable.skirt13, R.drawable.skirt14, R.drawable.skirt15
    56. , R.drawable.skirt16, R.drawable.skirt17, R.drawable.skirt18, R.drawable.skirt19
    57. , R.drawable.skirt20, R.drawable.skirt21, R.drawable.skirt22, R.drawable.skirt23};
    58. private static String[] stagTitleArray = {"促销价", "惊爆价", "跳楼价", "白菜价", "清仓价", "割肉价",
    59. "实惠价", "一口价", "满意价", "打折价", "腰斩价", "无人问津", "算了吧", "大声点",
    60. "嘘嘘", "嗯嗯", "呼呼", "呵呵", "哈哈", "嘿嘿", "嘻嘻", "嗷嗷", "喔喔"};
    61. public static List<NewsInfo> getDefaultStag() {
    62. List<NewsInfo> stagList = new ArrayList<NewsInfo>();
    63. for (int i = 0; i < stagImageArray.length; i++) {
    64. stagList.add(new NewsInfo(stagImageArray[i], stagTitleArray[i], null));
    65. }
    66. return stagList;
    67. }
    68. private static int[] combineImageArray = {R.drawable.cainixihuan, R.drawable.dapaijiadao
    69. , R.drawable.trip_01, R.drawable.trip_02, R.drawable.trip_03, R.drawable.trip_04};
    70. private static String[] combineTitleArray = {
    71. "猜你喜欢", "大牌驾到", "买哪个", "别想了", "先下单", "包你满意"};
    72. public static List<NewsInfo> getDefaultCombine() {
    73. List<NewsInfo> combineList = new ArrayList<NewsInfo>();
    74. for (int i = 0; i < combineImageArray.length; i++) {
    75. combineList.add(new NewsInfo(combineImageArray[i], combineTitleArray[i], null));
    76. }
    77. return combineList;
    78. }
    79. private static int[] appiImageArray = {R.drawable.dian01, R.drawable.dian02, R.drawable.dian03
    80. , R.drawable.dian04, R.drawable.dian05, R.drawable.dian06, R.drawable.dian07
    81. , R.drawable.dian08, R.drawable.dian09, R.drawable.dian10, R.drawable.dian11
    82. , R.drawable.dian12, R.drawable.dian13, R.drawable.dian14, R.drawable.dian15};
    83. private static String[] appiTitleArray = {"双十一", "大聚惠", "爆款价",
    84. "就一次", "手慢无", "快点击", "付定金", "享特权", "包安装", "再返券",
    85. "白送你", "想得美", "干活去", "好好学", "才有钱"};
    86. public static List<NewsInfo> getDefaultAppi() {
    87. List<NewsInfo> appiList = new ArrayList<NewsInfo>();
    88. for (int i = 0; i < appiImageArray.length; i++) {
    89. appiList.add(new NewsInfo(appiImageArray[i], appiTitleArray[i], null));
    90. }
    91. return appiList;
    92. }
    93. }

     

     

    item_staggered.xml

    1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    2. android:id="@+id/ll_item"
    3. android:layout_width="match_parent"
    4. android:layout_height="wrap_content"
    5. android:background="@color/white"
    6. android:orientation="vertical">
    7. <ImageView
    8. android:id="@+id/iv_pic"
    9. android:layout_width="match_parent"
    10. android:layout_height="wrap_content"
    11. android:scaleType="centerCrop" />
    12. <TextView
    13. android:id="@+id/tv_title"
    14. android:layout_width="match_parent"
    15. android:layout_height="wrap_content"
    16. android:gravity="center"
    17. android:textColor="@color/black"
    18. android:textSize="17sp" />
    19. </LinearLayout>

    RecyclerExtras
    
    1. package com.example.myapplication.widget;
    2. import android.view.View;
    3. public class RecyclerExtras
    4. {
    5. // 定义一个循环视图列表项的点击监听器接口
    6. public interface OnItemClickListener
    7. {
    8. void onItemClick(View view, int position);
    9. }
    10. // 定义一个循环视图列表项的长按监听器接口
    11. public interface OnItemLongClickListener
    12. {
    13. void onItemLongClick(View view, int position);
    14. }
    15. // 定义一个循环视图列表项的删除监听器接口
    16. public interface OnItemDeleteClickListener
    17. {
    18. void onItemDeleteClick(View view, int position);
    19. }
    20. }

    RecyclerStagAdapter
    
    1. package com.example.myapplication.adapter;
    2. import android.annotation.SuppressLint;
    3. import android.content.Context;
    4. import android.view.LayoutInflater;
    5. import android.view.View;
    6. import android.view.View.OnClickListener;
    7. import android.view.View.OnLongClickListener;
    8. import android.view.ViewGroup;
    9. import android.widget.ImageView;
    10. import android.widget.LinearLayout;
    11. import android.widget.TextView;
    12. import android.widget.Toast;
    13. import androidx.recyclerview.widget.RecyclerView;
    14. import androidx.recyclerview.widget.RecyclerView.ViewHolder;
    15. import com.example.myapplication.R;
    16. import com.example.myapplication.bean.NewsInfo;
    17. import com.example.myapplication.widget.RecyclerExtras.OnItemClickListener;
    18. import com.example.myapplication.widget.RecyclerExtras.OnItemLongClickListener;
    19. import java.util.List;
    20. @SuppressLint("DefaultLocale")
    21. public class RecyclerStagAdapter extends RecyclerView.Adapter<ViewHolder> implements OnItemClickListener, OnItemLongClickListener
    22. {
    23. private final static String TAG = "RecyclerStagAdapter";
    24. private Context mContext; // 声明一个上下文对象
    25. private List<NewsInfo> mGoodsList;
    26. public RecyclerStagAdapter(Context context, List<NewsInfo> goodsList)
    27. {
    28. mContext = context;
    29. mGoodsList = goodsList;
    30. }
    31. // 获取列表项的个数
    32. public int getItemCount()
    33. {
    34. return mGoodsList.size();
    35. }
    36. // 创建列表项的视图持有者
    37. public ViewHolder onCreateViewHolder(ViewGroup vg, int viewType)
    38. {
    39. // 根据布局文件item_staggered.xml生成视图对象
    40. View v = LayoutInflater.from(mContext).inflate(R.layout.item_staggered, vg, false);
    41. return new ItemHolder(v);
    42. }
    43. // 绑定列表项的视图持有者
    44. public void onBindViewHolder(ViewHolder vh, final int position)
    45. {
    46. ItemHolder holder = (ItemHolder) vh;
    47. holder.iv_pic.setImageResource(mGoodsList.get(position).pic_id);
    48. holder.tv_title.setText(mGoodsList.get(position).title);
    49. // LayoutParams params = holder.ll_item.getLayoutParams();
    50. // params.height = new Random().nextInt(100);
    51. // if (params.height < 60) {
    52. // params.height = 60;
    53. // }
    54. // // 很奇怪,setLayoutParams对瀑布流网格不起作用,只能用setHeight
    55. // holder.tv_title.setHeight(params.height);
    56. // 列表项的点击事件需要自己实现
    57. holder.ll_item.setOnClickListener(new OnClickListener() {
    58. @Override
    59. public void onClick(View v) {
    60. if (mOnItemClickListener != null) {
    61. mOnItemClickListener.onItemClick(v, position);
    62. }
    63. }
    64. });
    65. // 列表项的长按事件需要自己实现
    66. holder.ll_item.setOnLongClickListener(new OnLongClickListener()
    67. {
    68. @Override
    69. public boolean onLongClick(View v) {
    70. if (mOnItemLongClickListener != null) {
    71. mOnItemLongClickListener.onItemLongClick(v, position);
    72. }
    73. return true;
    74. }
    75. });
    76. }
    77. // 获取列表项的类型
    78. public int getItemViewType(int position) {
    79. return 0;
    80. }
    81. // 获取列表项的编号
    82. public long getItemId(int position) {
    83. return position;
    84. }
    85. // 定义列表项的视图持有者
    86. public class ItemHolder extends ViewHolder {
    87. public LinearLayout ll_item; // 声明列表项的线性布局
    88. public ImageView iv_pic; // 声明列表项图标的图像视图
    89. public TextView tv_title; // 声明列表项标题的文本视图
    90. public ItemHolder(View v) {
    91. super(v);
    92. ll_item = v.findViewById(R.id.ll_item);
    93. iv_pic = v.findViewById(R.id.iv_pic);
    94. tv_title = v.findViewById(R.id.tv_title);
    95. }
    96. }
    97. // 声明列表项的点击监听器对象
    98. private OnItemClickListener mOnItemClickListener;
    99. public void setOnItemClickListener(OnItemClickListener listener) {
    100. this.mOnItemClickListener = listener;
    101. }
    102. // 声明列表项的长按监听器对象
    103. private OnItemLongClickListener mOnItemLongClickListener;
    104. public void setOnItemLongClickListener(OnItemLongClickListener listener) {
    105. this.mOnItemLongClickListener = listener;
    106. }
    107. // 处理列表项的点击事件
    108. public void onItemClick(View view, int position) {
    109. String desc = String.format("您点击了第%d项,商品名称是%s", position + 1,
    110. mGoodsList.get(position).title);
    111. Toast.makeText(mContext, desc, Toast.LENGTH_SHORT).show();
    112. }
    113. // 处理列表项的长按事件
    114. public void onItemLongClick(View view, int position) {
    115. String desc = String.format("您长按了第%d项,商品名称是%s", position + 1,
    116. mGoodsList.get(position).title);
    117. Toast.makeText(mContext, desc, Toast.LENGTH_SHORT).show();
    118. }
    119. }

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    vue中记录滚动条位置
    漏电继电器 LLJ-630F φ100 导轨安装 分体式结构 LLJ-630H(S) AC
    Android Camera 测试环境搭建:Android 原生代码下载
    对话 ONES 联合创始人兼 CTO 冯斌:技术管理者如何打造一支自驱型团队?
    混合输入矩阵乘法的性能优化
    车道线检测2022新工作整理,2D、3D都有
    JS中findIndex方法的使用场景以及与find的差别
    云原生数据湖以存储、计算、数据管理等能力通过信通院评测认证
    phpstorm安装xdebug(phpstudy环境下)成功运行
    别再用 System.currentTimeMillis 统计耗时了,太 Low,试试 Spring Boot 源码在用的 StopWatch吧,够优雅
  • 原文地址:https://blog.csdn.net/m0_61442607/article/details/126812629