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

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

时间: 2024-09-17 23:58:33

Android 列表形式的切换的示例代码的相关文章

Android 实现无网络页面切换的示例代码

本文介绍了Android 实现无网络页面切换的示例代码,分享给大家,具体如下: 实现思路 需求是在无网络的时候显示特定的页面,想到要替换页面的地方,大多都是recyclerview或者第三方recyclerview这种需要显示数据的地方,因此决定替换掉页面中所有的recyclerview为无网络页面 实现过程 1 在BaseActivity中,当加载布局成功以后,通过id找到要替换的view,通过indexOfChild()方法,找到要替换的view的位置,再通过remove和add view来

Android TextView实现词组高亮的示例代码

本文介绍了Android TextView实现词组高亮的示例代码,分享给大家,具体如下: HighlightTextView Android文本高亮控件,基于View实现. 特点 文本高亮 单词自动换行 高亮词组保持在同一行显示 效果如下: 主要逻辑: 两个 Paint 负责绘制不同的文字 在每次绘制之前计算将要绘制的文本是否会超出屏幕宽度,如果超出则换行 protected void onDraw(Canvas canvas) { super.onDraw(canvas); float x_d

Android ListView组件详解及示例代码_Android

Android 列表组件 ListView 列表组件是开发中经常用到组件,使用该组件在使用时需要为它提供适配器,由适配器提供来确定显示样式和显示数据. 下面看一个例子: 新建一个项目Lesson8_ListViewTest,Activity name是MainListViewTest . MainListViewTest.java的代码是: package android.basic.lesson8; import android.app.Activity; import android.os.

Android Dialog 对话框详解及示例代码_Android

Android Dialog 对话框 1.Dialog介绍 2.AlertDialog的基本使用 3.自定义对话框 Custom Dialog 一.Dialog介绍 Dialog也是Android中常用的用户界面元素,他同Menu一样也不是View的子类.让我们看一下它的继承关系: 这里要留意一下他的直接子类 AlertDialog,和间接子类 DatePickerDialog,ProgressDialog,TimePickerDialog,其中后三个我们在前面的章节已经讲过,今天我们把重点放在

Android 事件分发详解及示例代码_Android

事件分发是Android中非常重要的机制,是用户与界面交互的基础.这篇文章将通过示例打印出的Log,绘制出事件分发的流程图,让大家更容易的去理解Android的事件分发机制. 一.必要的基础知识 1.相关方法 Android中与事件分发相关的方法主要包括dispatchTouchEvent.onInterceptTouchEvent.onTouchEvent三个方法,而事件分发一般会经过三种容器,分别为Activity.ViewGroup.View.下表对这三种容器分别拥有的事件分发相关方法进行

Android AIDL和远程Service调用示例代码_Android

Android:AIDL和远程Service调用 本讲的内容,理解起来很难,也许你看了很多资料也看不明白,但是用起来缺简单的要命.所以我们干脆拿一个音乐播放器中进度条的实例来说明一下AIDL和Remote Service的价值和使用方法,你把这个例子跑一边,体会一下就OK了.下面的例子是我 正在准备的项目实例中的一部分. 首先说明一下我们面临的问题,如果看不懂下面的描述请看前面的课程: 第一.我们知道在AndroId中如果需要进行音乐播放,最方面的方法就是使用自带的MediaPlayer对象,如

《Android程序设计》一1.5 示例代码

1.5 示例代码 Android SDK安装完成并经过测试证明已经可以正常工作之后,可以进一步探索Android.即使你对Android的框架不熟悉,并且是Java新手,学习一些示例代码可以使你在阅读本书的其他部分之前,对SDK的安装更有自信. 1.5.1 SDK示例代码 SDK提供了最便捷的示例代码.可以使用SDK示例创建新的项目,如图1-16所示.选定的示例会出现在Eclipse窗口的左窗格,可以浏览该示例中所包含的文件,运行它查看它实现了什么功能.如果已经能够熟练使用IDE来调试这些代码,

Android Content Provider详解及示例代码_Android

Android:Content Provider的使用. 1.Content Provider 简介 2.使用现成的Content Provider 3.定义自己的Content Provider 一.Content Provider 简介 我们说Android应用程序的四个核心组件是:Activity.Service.Broadcast Receiver 和 Content Provider.在Android中,应用程序彼此之间相互独立的,它们都运行在自己独立的虚拟机中.Content Pro

Yii2使用驼峰命名的形式访问控制器的示例代码

yii2在使用的时候,访问控制器的时候,如果控制器的名称是驼峰命名法,那访问的url中要改成横线的形式.例如: public function actionRoomUpdate() { // } //访问的时候就要www.test.com/room-update这样访问 最近在做某渠道的直连的时候,他们提供的文档上明确指出接口的形式: 刚开始以为YII2中肯定有这样的设置,然后就去google了下,发现都说不行,自己去看了下,果然,框架里面直接是写死的:(源码)\vendor\yiisoft\y