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

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

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

如京东:

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

标签:Android,列表,切换
0
投稿

猜你喜欢

  • 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
  • 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
  • 使用SpringBoot打jar包并部署到Tomcat详细步骤

    2023-12-06 07:15:16
  • java后端进行跨域的几种方式小结

    2021-09-03 14:53:31
  • 浅析C# 结构体struct

    2021-08-08 08:21:19
  • Android实现图片文字轮播特效

    2021-07-25 18:44:11
  • java 安全 ysoserial CommonsCollections6 分析

    2021-06-04 01:58:14
  • 举例讲解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
  • asp之家 软件编程 m.aspxhome.com