实现带标题的ListView

article/2025/9/23 14:18:29

在一些项目中,往往有要求为ListView里的内容分类,比如按日期分类,就要把相同日期的项目放在一起。可以看一些示例图,会清楚一些:
这里写图片描述这里写图片描述
以上根据标题来进行分类,实现代码如下:

首先是数据项的模型:

public class Data {private String text1, text2, text3; //数据1 2 3public Data(String text1, String text2, String text3) {this.text1 = text1;this.text2 = text2;this.text3 = text3;}public String getText1() {return text1;}public String getText2() {return text2;}public String getText3() {return text3;}
}

因为要分类,所以需要一些类来存标题和数据Data集合:

public class Type {private String title;  //ListView头部显示的标题private List<Data> mList; //头部对应的内容集合public Type(String title) {this.title = title;mList = new ArrayList<>();}/*** 添加项目* @param data Data对象*/public void addItem(Data data) {mList.add(data);}/*** 获取项目* @param position 如果position为1就返回标题* @return*/public Object getItem(int position) {if (position == 0) {return title;} else {return mList.get(position - 1);}}/*** @return item数目,为集合大小+1*/public int size() {return mList.size() + 1;}
}

紧接着实现适配器Adapter,主要的逻辑设计在此部分:

public class MyAdapter extends BaseAdapter {private static final int TYPE_HEADER = 0;  //代表标题private static final int TYPE_ITEM = 1;    //代表项目itemprivate List<Type> mList;private LayoutInflater inflater;public MyAdapter(Context context, List<Type> list) {mList = list;inflater = LayoutInflater.from(context);}/**** @return 所有项的总和*/@Overridepublic int getCount() {int count = 0;if (mList != null) {for (Type type : mList) {count += type.size();}}return count;}/*** 根据position的不同返回不同的值* @param position* @return*/@Overridepublic Object getItem(int position) {int head = 0;  //标题位置for (Type type : mList) {int size = type.size();int current = position - head;if (current < size) {//返回对应位置的值return type.getItem(current);}head += size;}return null;}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder viewHolder;switch (getItemViewType(position)) {//分为两种情况加载itemcase TYPE_HEADER: //加载标题布局if (convertView == null) {viewHolder = new ViewHolder();convertView = inflater.inflate(R.layout.header, parent, false);viewHolder.title = (TextView) convertView.findViewById(R.id.date);convertView.setTag(viewHolder);} else {viewHolder = (ViewHolder) convertView.getTag();}viewHolder.title.setText((CharSequence) getItem(position));break;case TYPE_ITEM: //加载数据项目布局if (convertView == null) {viewHolder = new ViewHolder();convertView = inflater.inflate(R.layout.adapter, parent, false);viewHolder.tv1 = (TextView) convertView.findViewById(R.id.text1);viewHolder.tv2 = (TextView) convertView.findViewById(R.id.text2);viewHolder.tv3 = (TextView) convertView.findViewById(R.id.text3);convertView.setTag(viewHolder);} else {viewHolder = (ViewHolder) convertView.getTag();}Data data = (Data) getItem(position);viewHolder.tv1.setText(data.getText1());viewHolder.tv2.setText(data.getText2());viewHolder.tv3.setText(data.getText3());break;}return convertView;}/**** @return 返回item类型数目*/@Overridepublic int getViewTypeCount() {return 2;}/*** 获取当前item的类型* @param position* @return*/@Overridepublic int getItemViewType(int position) {int head = 0;for (Type type : mList) {int size = type.size();int current = position - head;if (current == 0) {return TYPE_HEADER;}head += size;}return TYPE_ITEM;}/*** 判断当前的item是否可以点击* @param position* @return*/@Overridepublic boolean isEnabled(int position) {return getItemViewType(position) != TYPE_HEADER;}@Overridepublic boolean areAllItemsEnabled() {return false;}private class ViewHolder {TextView tv1, tv2, tv3, title;}
}

最后,简单写一个测试的Activity:

public class MainActivity extends AppCompatActivity {private ListView listView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);listView = (ListView) findViewById(R.id.list);List<Type> list = new ArrayList<>();for (int i = 1; i <= 5; i++) {Type type = new Type("标题" + i);for (int j = 0; j < Math.random() * 6; j++) {Data data = new Data("数据1", "数据2", "数据3");type.addItem(data);}list.add(type);}MyAdapter adapter = new MyAdapter(this, list);listView.setAdapter(adapter);}
}

附上两个所需的XML:
adapter.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent"><LinearLayout
        android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><ImageView
            android:layout_width="70dp"android:layout_height="70dp"android:src="@android:drawable/btn_star_big_on"android:scaleType="centerCrop"/><TextView
            android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="20dp"android:id="@+id/text1"android:text="text"android:textSize="17sp"android:layout_gravity="center_vertical"/><TextView
            android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="20dp"android:id="@+id/text2"android:text="text"android:textSize="17sp"android:layout_gravity="center_vertical"/><TextView
            android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="20dp"android:id="@+id/text3"android:text="text"android:textSize="17sp"android:layout_gravity="center_vertical"/></LinearLayout></LinearLayout>

header.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent"><TextView
        android:layout_width="match_parent"android:layout_height="wrap_content"android:textSize="25sp"android:id="@+id/date"android:background="@android:color/holo_purple"/>
</LinearLayout>

http://chatgpt.dhexx.cn/article/vwn4dVsW.shtml

相关文章

java操作excel表格详解

在日常工作中&#xff0c;对Excel工作表格的操作处理可是多的数不清楚&#xff0c;下面是java语言对其的操作&#xff0c;有需要的小伙伴可以参考下 使用场景 1、将用户信息导出为excel表格&#xff08;导出数据…) 2、将Excel表中的信息录入到网站数据库(习题上传…&#xf…

安卓表格框架-ExcelView

转载请标明来源&#xff1a;安卓表格框架-ExcelView_分享记录-CSDN博客 Github地址&#xff0c;欢迎star&#xff1a;https://github.com/September26/ExcelView 一.项目介绍 项目是仿照WPS中Excel的功能实现的&#xff0c;实现了显示&#xff0c;滑动&#xff0c;编辑等基本…

html表格打印填充分页,window.print()页面打印之表格内容分页填充进行分页打印

windwow.print()用于打印当前窗口的内容,很简便,可当内容特殊并且打印有特殊需求的时候就要绕个圈了。下面是需要打印的表格: 当数据量少的时候像上面的表格一样,中间的内容只有5条数据,打印出来在纸上会有空白,不太好。中间内容是不确定的可能几十条,可能上百条,这样循…

在线表格

在线表格案例 模仿的是腾讯文档 首先观察腾讯文档的表格效果&#xff0c;然后在构建出思路&#xff0c;开始编写代码 效果图&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title>在线表格<…

Java获取word表格中的数据

前言: 有时系统中需要提取各种文件中的数据&#xff0c;比如做报表的系统中就常常与Excel表格数据做交互。做Excel报表数据时有选择POI实现的&#xff0c;但是POI功能也很单一&#xff0c;对于文档格式维护性差&#xff0c;最重要的是POI在操作word数据时显得力不从心&#xf…

HTML 表格元素

表格元素 在日常生活中&#xff0c;我们对表格已经非常熟悉了&#xff0c;表格的基本作用是用来存放数据&#xff0c;它是数据的二维容器&#xff0c;人们常常用它来记录财务数据、列车时刻表、电视节目单等。 大多数情况下&#xff0c;表格都是由列标题或行标题&#xff0c;…

Bootstrap3 表格样式

表格 HTML表格是数据的二维容器&#xff0c;它的基本作用是用来存放数据。表格能够清晰、直观地描述数据间的逻辑关系&#xff0c;如果借助CSS设计表格的样式&#xff0c;阅读数据将会变得更轻松。 表格结构包括众多标签&#xff0c;这些标签各司其职&#xff0c;共同完成二维…

数据库表格查询

1、数据库表示存储数据中所有数据的对象&#xff0c;在表中&#xff0c;数据按行和烈格式逻辑组织&#xff0c;类似于电子表格&#xff0c;数据库是SchoolMangeSystem&#xff0c;使用数据库表是SYS_Student&#xff0c;如下图&#xff1a; select字段列表&#xff0c;字段别名…

html中标题距离顶部距离,版式设计中标题间距的使用法则

主标题与副标题定义 主标题是文案的核心主旨&#xff0c;可以直接表达&#xff0c;也可以含蓄表达&#xff0c; 副标题是对对主标题意思的具体阐释&#xff0c;或者主标题意思的进一步延伸。 字距与行距 横向的字间距与纵向的行间距的关系&#xff1a; 请保持行间距的高度&…

表格解析 概览

表格解析发展至今&#xff0c;仍然是一项很年轻的研究领域&#xff0c;出现了大量解决方案&#xff0c;常用的技术包括&#xff1a;线检测、box检测、分割、多模态融合、GCN、img2seq。以下按我的理解梳理一下表格解析各个流派&#xff0c;从中了解这项任务背后所采用的技术。在…

5.让表格的标题在滚动表格时一动不动

一、冻结首行首列 处理数据量较大的表格时&#xff0c;向下拖动滚动条&#xff0c;表格的标题栏就不见了&#xff0c;用户在查看数据时&#xff0c;需要来回拖动滚动条才能看到标题&#xff0c;那么是否可以将表格设置成无论怎样滚动表格&#xff0c;标题都始终显示呢&#xf…

python表格控件_python表格控件

广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! pyqt5表格控件qtableview简介在通常情况下,一个应用需要和一批数据进行交互,然后以表格的形式输出这些信息,这时就需要用到qtableview类了,在qtableview中可…

element-ui(vue)表格的自定义标题,逻辑判断

<el-table :data"tableData" style"width: 100%" border><el-table-column width"180"><!-- 自定义标题--><template slot"header"><i class"el-icon-time"></i><span>自定义标题…

tomcat-命令窗口乱码

问题描述&#xff1a;刚下载的tomgcat不添加任何项目直接运行时&#xff0c;tomcat的命令窗口出现中文乱码 解决方法&#xff1a; 1、找到${CATALINA_HOME}/conf/logging.properties 2、添加语句&#xff1a;java.util.logging.ConsoleHandler.encoding GBK 3、重启tomcat&…

在此处打开命令窗口 (Open command window here)

在此处打开命令窗口 (Open command window here) 1. 在此处打开命令窗口 (Open command window here) Shift 鼠标右键 2. .exe 执行 在 .exe 文件所在的文件夹打开命令提示符窗口。如果使用的是 Windows Vista 或 Windows 7 系统&#xff0c;则需要在 Windows Explorer 中右…

mysql自动弹出命令窗口 解决

为什么mysql会自动弹出来命令窗口 关键词&#xff1a; Unable to connect to remote host. Catalog download has failed. 解决办法&#xff1a; 控制面板&#xff08;小图标&#xff09;->管理工具->任务计划程序->mysql->installer 右键禁用即可

win10系统中如何显示在此处打开命令窗口

1、首先按住windowsr键&#xff0c;在弹出的窗口中输入regedit&#xff0c;点击回车 2、找到 计算机\HKEY_CLASSES_ROOT\Directory\Background\shell\cmd&#xff0c;在右侧的框中&#xff0c;鼠标选择“默认”项&#xff0c;右键点击“修改”&#xff0c;在弹出的窗口中输入“…

Windows10如何在文件夹打开DOS命令窗口

在安装RabbitMQ的时候&#xff0c;总结了一下在当前文件夹打开DOS窗口的方式&#xff0c;大概有三种方式&#xff0c;推荐使用第三种。 &#xff08;这里D:\Tools\RabbitMQ\RabbitMQServer\rabbitmq_server-3.9.8\sbin作为目标文件夹&#xff09; 第一种方式 1、winr&#xf…

记录下使用plsql命令窗口执行sql脚本的写法

如果把sql脚本放在sql窗口中执行&#xff0c;速度比较慢&#xff0c;所以可以在命令窗口中输入sql脚本的位置来执行 SQL> C:\Users\Administrator\Desktop\脚本.txt 注意&#xff0c;路径前要加上&#xff0c;否则不会执行。

linux基础-- 桌面系统如何切换命令窗口

简单说一下linux 的一些基本命令&#xff0c;对linux的命令进行一个简单的了解。&#xff08;操作系统为centos7&#xff09; 一般我们个人安装的centos的时候会安装一个桌面系统. window是带有桌面&#xff0c;linux不同的版本也会带有自己的桌面系统的。而centos有两种常见…