Android 列表形式的切换的示例代码
作者:看窗外的小狗 时间:2022-12-17 07:38:24
电商项目中经常有这样的需求:在商品列表页面中,切换列表的展现形式,一般分为列表形式和表格形式。
如京东:
本文最终实现的效果:
关键词: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
标签:Android,列表,切换
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
java面试常问的Runnable和Callable的区别
2023-11-23 09:23:28
Android开发解决popupWindow重叠报错问题
2022-08-02 13:27:01
C#实现读取指定盘符硬盘序列号的方法
2023-05-23 15:06:39
C# 中的 is 真的是越来越强大越来越语义化(推荐)
2021-06-24 11:55:12
![](https://img.aspxhome.com/file/2023/0/126130_0s.png)
C#实现程序开机启动的方法
2023-09-23 00:55:20
解析Tomcat 6、7在EL表达式解析时存在的一个Bug
2023-07-03 22:02:50
AOP之事务管理<aop:advisor>的两种配置方式
2023-11-24 22:55:06
Java多线程编程之访问共享对象和数据的方法
2022-10-01 07:05:02
解决IDEA springboot"spring-boot-maven-plugin"报红问题
2023-08-15 21:29:19
![](https://img.aspxhome.com/file/2023/3/72543_0s.png)
使用SpringBoot打jar包并部署到Tomcat详细步骤
2023-12-06 07:15:16
![](https://img.aspxhome.com/file/2023/2/73132_0s.png)
java后端进行跨域的几种方式小结
2021-09-03 14:53:31
浅析C# 结构体struct
2021-08-08 08:21:19
Android实现图片文字轮播特效
2021-07-25 18:44:11
![](https://img.aspxhome.com/file/2023/0/122060_0s.jpg)
java 安全 ysoserial CommonsCollections6 分析
2021-06-04 01:58:14
![](https://img.aspxhome.com/file/2023/3/63083_0s.png)
举例讲解C语言对归并排序算法的基础使用
2021-05-24 19:48:09
C语言字符串大小比较
2022-06-02 14:15:17
C#中WebBrowser.DocumentCompleted事件多次调用问题解决方法
2023-12-05 18:23:15
Java中自然排序和比较器排序详解
2022-09-04 21:04:49
Android Universal ImageLoader 缓存图片
2023-03-04 05:16:54
游戏开发之随机概率的选择算法
2022-08-26 13:21:09