Android 列表形式的切换的示例代码

发布时间 - 2026-01-11 03:14:59    点击率:

电商项目中经常有这样的需求:在商品列表页面中,切换列表的展现形式,一般分为列表形式和表格形式。

如京东:

本文最终实现的效果:

关键词:RecyclerView

主布局文件:activity_main.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="match_parent">

  <android.support.v7.widget.RecyclerView
    android:id="@+id/recycler_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

</LinearLayout>

列表形式布局文件:item_list.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="98dp"
  android:layout_margin="8dp"
  android:background="@color/colorAccent">

  <TextView
    android:id="@+id/text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="@style/TextAppearance.AppCompat.Large.Inverse"
    android:layout_centerInParent="true"
    tools:text="1" />

</RelativeLayout>

表格形式布局文件:item_grid.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="98dp"
  android:layout_margin="8dp"
  android:background="@color/colorAccent">

  <TextView
    android:id="@+id/text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="@style/TextAppearance.AppCompat.Large"
    android:layout_centerInParent="true"
    tools:text="1" />

</RelativeLayout>

实现原理:使用 RecyclerView 的 GridLayoutManager,列表形式指定列数为1,表格形式指定列数为具体列值。
默认为列表形式,指定列数为1:

recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
// 指定列数为1
gridLayoutManager = new GridLayoutManager(this, COLUMN_ONE);
recyclerView.setLayoutManager(gridLayoutManager);  

列表形式和表格形式之间的切换:

  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    if (id == R.id.action_toggle) {
      if (gridLayoutManager.getSpanCount() == COLUMN_ONE) {
        gridLayoutManager.setSpanCount(COLUMN_THREE);
        item.setIcon(ContextCompat.getDrawable(this, R.drawable.ic_grid));
      } else {
        gridLayoutManager.setSpanCount(COLUMN_ONE);
        item.setIcon(ContextCompat.getDrawable(this, R.drawable.ic_list));
      }
      simpleAdapter.notifyItemRangeChanged(0, simpleAdapter.getItemCount());
      return true;
    }
    return super.onOptionsItemSelected(item);
  }

通过 gridLayoutManager.setSpanCount(int cloumn) 设置列数,最后不要忘记 simpleAdapter.notifyItemRangeChanged(0, simpleAdapter.getItemCount()) 刷新数据。

Adapter的处理:

定义两种 view 类型:VIEW_TYPE_LIST 和 VIEW_TYPE_GRID

根据不同的 view 类型加载相应的布局文件,如下:

  @Override
  public SimpleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView;
    if (viewType == VIEW_TYPE_LIST) {
      itemView = LayoutInflater.from(parent.getContext())
          .inflate(R.layout.item_list, parent, false);
    } else {
      itemView = LayoutInflater.from(parent.getContext())
          .inflate(R.layout.item_grid, parent, false);
    }
    return new SimpleViewHolder(itemView, viewType);
  }

获取 view 类型:列数为1时,view 类型为 VIEW_TYPE_LIST,列数为3时, view类型为 VIEW_TYPE_GRID

  @Override
  public int getItemViewType(int position) {
    final int viewType;
    int column = layoutManager.getSpanCount();
    switch (column) {
      case COLUMN_ONE:
        viewType = VIEW_TYPE_LIST;
        break;
      case COLUMN_THREE:
        viewType = VIEW_TYPE_GRID;
        break;
      default:
        throw new RuntimeException("wtf?");
    }
    return viewType;

完整代码:https://github.com/wangshouquan/list-to-grid

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# Android  # 列表形式的切换  # 列表切换  # Android仿淘宝切换商品列表布局效果的示例代码  # Android之淘宝商品列表长按遮罩效果的实现  # Android仿美团淘宝实现多级下拉列表菜单功能  # Android实现淘宝商品列表切换效果  # 关键词  # 数为  # 两种  # 大家多多  # 不要忘记  # 默认为  # 京东  # 中经  # 加载  # RelativeLayout  # item_list  # wrap_content  # tools  # layout_margin  # dp  # support  # layout_height  # widget  # match_parent  # recycler_view 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在服务器上配置二级域名建站?  JavaScript Ajax实现异步通信  如何快速查询网址的建站时间与历史轨迹?  Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  Laravel如何实现多对多模型关联?(Eloquent教程)  如何在万网自助建站中设置域名及备案?  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  如何用免费手机建站系统零基础打造专业网站?  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  如何登录建站主机?访问步骤全解析  Laravel用户密码怎么加密_Laravel Hash门面使用教程  微信小程序 配置文件详细介绍  网站制作企业,网站的banner和导航栏是指什么?  UC浏览器如何设置启动页 UC浏览器启动页设置方法  微信h5制作网站有哪些,免费微信H5页面制作工具?  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  Laravel的.env文件有什么用_Laravel环境变量配置与管理详解  新三国志曹操传主线渭水交兵攻略  Python函数文档自动校验_规范解析【教程】  javascript中闭包概念与用法深入理解  Laravel如何优化应用性能?(缓存和优化命令)  高防服务器租用如何选择配置与防御等级?  大连 网站制作,大连天途有线官网?  佛山网站制作系统,佛山企业变更地址网上办理步骤?  EditPlus中的正则表达式实战(6)  如何打造高效商业网站?建站目的决定转化率  Laravel定时任务怎么设置_Laravel Crontab调度器配置  Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境  免费视频制作网站,更新又快又好的免费电影网站?  Laravel如何创建自定义Facades?(详细步骤)  Android Socket接口实现即时通讯实例代码  如何在IIS7上新建站点并设置安全权限?  制作企业网站建设方案,怎样建设一个公司网站?  jQuery 常见小例汇总  nodejs redis 发布订阅机制封装实现方法及实例代码  如何快速完成中国万网建站详细流程?  网站图片在线制作软件,怎么在图片上做链接?  JavaScript如何操作视频_媒体API怎么控制播放  奇安信“盘古石”团队突破 iOS 26.1 提权  Laravel如何处理表单验证?(Requests代码示例)  瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口  三星网站视频制作教程下载,三星w23网页如何全屏?  html如何与html链接_实现多个HTML页面互相链接【互相】  Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析  linux写shell需要注意的问题(必看)  Laravel如何与Docker(Sail)协同开发?(环境搭建教程)  开心动漫网站制作软件下载,十分开心动画为何停播?  如何在建站之星绑定自定义域名?  绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信