软件编程
位置:首页>> 软件编程>> Android编程>> Android 列表形式的切换的示例代码

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

作者:看窗外的小狗  发布时间:2022-12-17 07:38:24 

标签:Android,列表,切换

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

如京东:

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

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

本文最终实现的效果:

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

关键词: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

来源:http://www.jianshu.com/p/41406ce9545f?utm_source=tuicool&utm_medium=referral

0
投稿

猜你喜欢

  • 前言Hello!上一期我大致讲解了关于Collection单列集合以及它的子接口List集合的概述、特点和遍历等,今天我为大家讲解关于Col
  • deque容器deque的相关文档deque与vector十分的相识。vector是单向开口的连续线性空间(单向扩容),deque则是一种双
  • 扩展Hibernate注解@CreationTimestamp,@UpdateTimestamp支持Java8新的时间类型Hibernate
  • Docker 存储驱动详细介绍最近做项目,期间对Docker 存储驱动不会,于是在网上找资料,并解决了,这里就记录下。目的理解docker的
  • 很多人使用Nacos其实并没有真正的去读过官网,以至于忽视了很多重要的细节,Nacos为我们提供了大量API,但是这些API默认是没有开启认
  • 在源码的阅读过程中,可以了解别人实现某个功能的涉及思路,看看他们是怎么想,怎么做的。接下来,我们看看这篇Java源码解析之object的详细
  • 一、结构型模式结构型模式有什么好处?从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题二、适配器模式USB网线转换器三、
  • 大多数浏览器会对同一域名的请求限制请求数量,一般是在8个以内。每次最多可以同时请求8个,要是资源多于8个,那么剩下的就要排队等待请求了。所以
  • 导入maven项目各个注解均报错所遇问题导入maven项目各个注解均报错了思考1:这个项目使用了springboot;spring是个”大容
  • GoogleNow是Android4.1全新推出的一款应用他,它可以全面了解你的使用习惯,并为你提供现在或者未来可能用到的各种信息,Goog
  • 经过数字签名的文档,能够使作者之外的人无法对其进行修改。因此,在PDF文档中添加数字签名可以保证其安全性和真实性。同时根据添加内容的差异性,
  • 前言:最近在工程中需要用到截取RotatedRect中的图形,保存为Mat做后续处理。发现opencv文档中没有这个api,最开始想到的方案
  • windows下使用cmd命令提示符生成java webservice客户端代码,可以使用命令提示符直接生成客户端代码,直接导入到项目中,只
  • 本文实例为大家分享了Java测试网络连通性的方法,供大家参考,具体内容如下第一种方式:利用java运行时: Java代码 /** * tes
  • 本文实例为大家分享了WPF自定义选择年月控件的具体代码,供大家参考,具体内容如下封装了一个选择年月的控件,XAML代码:<UserCo
  • 使用流读取、写入文件使用流把文件读取到字节数组://FileMode.Create, FileMode.Append //FileAcces
  • 同步方法和异步方法的区别同步方法调用在程序继续执行之前需要等待同步方法执行完毕返回结果异步方法则在被调用之后立即返回以便程序在被调用方法完成
  • Java 8来了,是时候学一下新的东西了。Java 7和Java 6只不过是稍作修改的版本,而Java 8将会发生重大的改进。或许是Java
  • MyBatis简介MyBatis前身是iBatis,是一个基于Java的数据持久层/对象关系映射(ORM)框架.MyBatis是对JDBC的
  • Class:EcanRMB.cs  using System; using System.Collections.Gen
手机版 软件编程 asp之家 www.aspxhome.com