将多个 Adapter 数据合并到一个 ListView 中

将多个 adapter 数据合并到一个 listview 中

正如摘要所述,本文将介绍如何将多个 Adapter 的数据合并显示在一个 ListView 中。虽然 RecyclerView 在性能和灵活性方面更胜一筹,但在某些情况下,使用 ListView 仍然是可行的选择。核心思路是创建一个自定义的 Adapter,并在其中处理不同类型的数据。

实现方法:自定义 Adapter 和 ViewHolder

要实现将多个 Adapter 的数据合并到一个 ListView 中,最常用的方法是创建一个自定义的 Adapter,并在该 Adapter 中处理不同类型的数据。这通常涉及到以下步骤:

定义数据类型: 首先,你需要定义 ListView 中可能出现的不同数据类型。例如,如果你的 ListView 要显示贷款申请和贷款信息,你需要创建两个不同的数据类,例如 LoanApplication 和 Loan。

创建 ViewHolder: 为每种数据类型创建一个 ViewHolder。ViewHolder 用于缓存 ListView 中每个 Item 的 View,避免重复查找 View,提高性能。例如,你可以创建 LoanApplicationViewHolder 和 LoanViewHolder。

创建自定义 Adapter: 创建一个继承自 BaseAdapter 的自定义 Adapter。在这个 Adapter 中,你需要重写以下方法:

getCount(): 返回所有数据类型的总数。getItemViewType(int position): 返回给定位置的数据类型。这对于区分不同的 ViewHolder 至关重要。getViewTypeCount(): 返回数据类型的总数。getItem(int position): 返回给定位置的数据对象。getView(int position, View convertView, ViewGroup parent): 这是最重要的一个方法。在这个方法中,你需要根据 getItemViewType() 返回的数据类型,选择对应的 ViewHolder,并填充数据。

示例代码:

以下是一个简化的示例代码,展示了如何将两种数据类型合并到一个 ListView 中:

AI帮个忙 AI帮个忙

多功能AI小工具,帮你快速生成周报、日报、邮、简历等

AI帮个忙 55 查看详情 AI帮个忙

import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.TextView;import java.util.ArrayList;import java.util.List;public class CombinedAdapter extends BaseAdapter {    private Context context;    private List dataList; // 使用 Object 存储不同类型的数据    private LayoutInflater inflater;    private static final int TYPE_LOAN_APPLICATION = 0;    private static final int TYPE_LOAN = 1;    public CombinedAdapter(Context context) {        this.context = context;        this.dataList = new ArrayList();        this.inflater = LayoutInflater.from(context);    }    // 添加数据    public void addData(List data, int type) {        if (data != null && !data.isEmpty()) {            for (Object item : data) {                if (type == TYPE_LOAN_APPLICATION && !(item instanceof LoanApplication)) {                    throw new IllegalArgumentException("Data type mismatch: expected LoanApplication");                }                if (type == TYPE_LOAN && !(item instanceof Loan)) {                    throw new IllegalArgumentException("Data type mismatch: expected Loan");                }                dataList.add(item);            }            notifyDataSetChanged();        }    }    @Override    public int getCount() {        return dataList.size();    }    @Override    public Object getItem(int position) {        return dataList.get(position);    }    @Override    public long getItemId(int position) {        return position;    }    @Override    public int getItemViewType(int position) {        Object item = dataList.get(position);        if (item instanceof LoanApplication) {            return TYPE_LOAN_APPLICATION;        } else if (item instanceof Loan) {            return TYPE_LOAN;        } else {            throw new IllegalArgumentException("Unknown data type at position: " + position);        }    }    @Override    public int getViewTypeCount() {        return 2; // 两种数据类型    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        int viewType = getItemViewType(position);        if (convertView == null) {            switch (viewType) {                case TYPE_LOAN_APPLICATION:                    convertView = inflater.inflate(R.layout.item_loan_application, parent, false);                    LoanApplicationViewHolder loanApplicationViewHolder = new LoanApplicationViewHolder(convertView);                    convertView.setTag(loanApplicationViewHolder);                    break;                case TYPE_LOAN:                    convertView = inflater.inflate(R.layout.item_loan, parent, false);                    LoanViewHolder loanViewHolder = new LoanViewHolder(convertView);                    convertView.setTag(loanViewHolder);                    break;            }        }        switch (viewType) {            case TYPE_LOAN_APPLICATION:                LoanApplicationViewHolder loanApplicationViewHolder = (LoanApplicationViewHolder) convertView.getTag();                LoanApplication loanApplication = (LoanApplication) getItem(position);                loanApplicationViewHolder.bind(loanApplication); // 填充 LoanApplication 数据                break;            case TYPE_LOAN:                LoanViewHolder loanViewHolder = (LoanViewHolder) convertView.getTag();                Loan loan = (Loan) getItem(position);                loanViewHolder.bind(loan); // 填充 Loan 数据                break;        }        return convertView;    }    // ViewHolder for LoanApplication    static class LoanApplicationViewHolder {        TextView textViewName;        TextView textViewAmount;        public LoanApplicationViewHolder(View itemView) {            textViewName = itemView.findViewById(R.id.textViewName);            textViewAmount = itemView.findViewById(R.id.textViewAmount);        }        public void bind(LoanApplication loanApplication) {            textViewName.setText(loanApplication.getName());            textViewAmount.setText(String.valueOf(loanApplication.getAmount()));        }    }    // ViewHolder for Loan    static class LoanViewHolder {        TextView textViewLoanId;        TextView textViewInterestRate;        public LoanViewHolder(View itemView) {            textViewLoanId = itemView.findViewById(R.id.textViewLoanId);            textViewInterestRate = itemView.findViewById(R.id.textViewInterestRate);        }        public void bind(Loan loan) {            textViewLoanId.setText(loan.getLoanId());            textViewInterestRate.setText(String.valueOf(loan.getInterestRate()));        }    }    // 模拟数据类    static class LoanApplication {        private String name;        private double amount;        public LoanApplication(String name, double amount) {            this.name = name;            this.amount = amount;        }        public String getName() {            return name;        }        public double getAmount() {            return amount;        }    }    static class Loan {        private String loanId;        private double interestRate;        public Loan(String loanId, double interestRate) {            this.loanId = loanId;            this.interestRate = interestRate;        }        public String getLoanId() {            return loanId;        }        public double getInterestRate() {            return interestRate;        }    }}

布局文件:

你需要创建两个不同的布局文件,分别对应两种数据类型。

item_loan_application.xmlitem_loan.xml

使用示例:

ListView listView = findViewById(R.id.listView);CombinedAdapter adapter = new CombinedAdapter(this);// 模拟数据List loanApplications = new ArrayList();loanApplications.add(new CombinedAdapter.LoanApplication("John Doe", 10000.0));loanApplications.add(new CombinedAdapter.LoanApplication("Jane Smith", 5000.0));List loans = new ArrayList();loans.add(new CombinedAdapter.Loan("L12345", 5.5));loans.add(new CombinedAdapter.Loan("L67890", 6.0));// 添加数据到 Adapteradapter.addData(loanApplications, CombinedAdapter.TYPE_LOAN_APPLICATION);adapter.addData(loans, CombinedAdapter.TYPE_LOAN);listView.setAdapter(adapter);

注意事项:

数据类型安全: 在 getItemViewType() 和 getView() 方法中,务必进行类型检查,确保正确处理不同类型的数据。性能优化: ViewHolder 的使用可以显著提高 ListView 的性能。数据更新: 当数据发生变化时,需要调用 notifyDataSetChanged() 方法通知 Adapter 更新数据。错误处理: 添加适当的错误处理机制,例如处理未知数据类型的情况。

总结:

通过自定义 Adapter 和 ViewHolder,你可以将多个 Adapter 的数据合并到一个 ListView 中显示。虽然这种方法相对复杂,但在某些情况下,它可以简化界面设计和数据管理。 然而,考虑到性能和灵活性,在新的项目中,推荐使用 RecyclerView 替代 ListView。RecyclerView 提供了更强大的功能,例如 ItemAnimator、LayoutManager 等,可以更好地满足复杂的界面需求。 记住,在选择使用 ListView 还是 RecyclerView 时,要根据项目的具体需求和性能要求进行权衡。

以上就是将多个 Adapter 数据合并到一个 ListView 中的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/344555.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
东呈会如何添加发票抬头
上一篇 2025年11月5日 19:49:23
小米11通话录音在哪里_小米11查找通话录音方法介绍
下一篇 2025年11月5日 19:49:31

相关推荐

  • Java中基于栈验证JSON字符串结构有效性的方法

    本文探讨了在Java中利用栈(Stack)数据结构验证JSON字符串结构有效性的方法。我们将分析一个常见的基于栈的实现示例,指出其在处理字符串内部字符、引号平衡以及转义字符方面的潜在缺陷。文章将提供一个改进的解决方案,并强调此方法主要用于结构匹配,而非完整的JSON语法验证,同时建议生产环境中使用专…

    2026年9月23日
    100
  • Java JSON字符串有效性验证:基于栈的实现与常见陷阱

    本文深入探讨了使用Java栈结构验证JSON字符串有效性的方法。通过分析一个常见错误示例,详细阐述了在处理括号、方括号以及字符串引号时的正确逻辑,特别强调了字符串内部字符(包括转义字符)不应影响结构平衡的原则,并提供了改进思路,旨在帮助开发者构建健壮的JSON验证器。 JSON结构与栈的适用性 JS…

    2026年9月23日
    000
  • 《勇者斗恶龙1&2 HD-2D重制版》新预告 新增内容展示

    《勇者斗恶龙1&2 HD-2D重制版》新预告 新增内容展示《勇者斗恶龙1&2 HD-2D重制版》新预告 新增内容展示《勇者斗恶龙1&2 HD-2D重制版》新预告 新增内容展示《勇者斗恶龙1&2 HD-2D重制版》新预告 新增内容展示

    近日,《勇者斗恶龙1+2 hd-2d重制版》发布了全新预告,展示了多项新增内容,包含可探索的全新地牢、让角色掌握新技能的“卷轴系统”、经典回归的“迷你奖牌收集玩法”,以及《勇者斗恶龙2》中备受喜爱的“海底探险”机制。 最新预告视频: 《勇者斗恶龙1+2 HD-2D重制版》计划于2025年10月30日…

    2026年9月23日 用户投稿
    200
  • 《植物大战僵尸:重植版》制作人:价格亲民 未使用AI!

    经典塔防游戏《植物大战僵尸》在问世16年后迎来重磅回归。由PopCap Games精心打造的重制作品——《植物大战僵尸:重植版》将于10月23日正式登陆PlayStation、Xbox、Nintendo Switch以及PC平台。 据The Gamer报道,该游戏执行制作人Jake Neri在采访中…

    2026年9月22日
    200
  • PHPRestfulAPI怎么开发_PHP构建高效安全的RestfulAPI教程

    答案:本文介绍如何用PHP构建高效安全的Restful API,涵盖设计规范、项目结构、数据库操作、安全机制、统一响应格式及性能优化。遵循Restful风格使用标准HTTP方法与状态码,通过index.php统一入口路由请求至控制器;采用PDO预处理防止SQL注入,结合JWT实现认证授权,确保输入验…

    2026年9月22日
    200
  • 《如龙0导剪版》结束Switch2独占 登全平台!不支持原版升级

    《如龙0导剪版》结束Switch2独占 登全平台!不支持原版升级《如龙0导剪版》结束Switch2独占 登全平台!不支持原版升级《如龙0导剪版》结束Switch2独占 登全平台!不支持原版升级《如龙0导剪版》结束Switch2独占 登全平台!不支持原版升级

    《如龙0:誓约的场所 导演剪辑版》将于12月9日结束在Switch2平台的限时独占,正式登陆PC、PS5以及Xbox Series X|S等多个平台,目前各平台商店页面已上线。 与2015年最初发布的版本相比,导演剪辑版加入了全新的简体中文字幕与中文语音配音,并新增了部分剧情内容,例如李文海在复活赛…

    2026年9月22日 用户投稿
    300
  • Linux内核13-进程切换

    进程切换,也称为任务切换、上下文切换或任务调度,本文将探讨linux内核中进程切换的实现。我们首先理解几个关键概念。 1.1 硬件上下文 每个进程都有自己的地址空间,但所有进程共享CPU寄存器。因此,在恢复进程执行前,内核必须确保挂起时的寄存器值被重新加载到CPU寄存器中。 这些需要加载到CPU寄存…

    2026年9月22日
    300
  • PHP三元运算符复杂条件_PHP三元运算符多条件处理

    三元运算符可通过逻辑运算符或嵌套实现多条件判断,如链式写法 $result = ($a > 5 && $b == 90) ? ‘优秀’ : $score >= 80 ? ‘良好’ : $score >= 60 ? &#…

    2026年9月22日
    100
  • Android自定义开关UI实现教程

    本文详细介绍了在Android应用中实现自定义开关UI的两种主要方法:一是通过集成第三方库如StickySwitch,快速实现美观且功能丰富的开关;二是通过结合Drawable XML和ToggleButton,实现高度定制化的开关外观。文章提供了详细的代码示例和配置说明,旨在帮助开发者灵活地创建符…

    2026年9月22日
    200
  • Linux进程调度学习!

    进程调度决定了哪个进程将被执行以及执行的时间,操作系统通过合理的进程调度实现资源的最大化利用。 在单片机上,常见的方式是系统初始化后进入 while(1){} 循环。当然,单片机也可以运行类似 FreeRTOS 的系统,从而实现进程切换。 在带有操作系统的 CPU 上运行的逻辑是允许多个进程(实际上…

    2026年9月22日
    000
  • 《零红蝶》重制版与原版对比截图 画面进化但有和谐

    《零红蝶》重制版与原版对比截图 画面进化但有和谐《零红蝶》重制版与原版对比截图 画面进化但有和谐《零红蝶》重制版与原版对比截图 画面进化但有和谐《零红蝶》重制版与原版对比截图 画面进化但有和谐

    之前光荣特库摩公开了恐怖游戏《零红蝶:重制版》,本作计划于2026年初发售,登陆ps5、xsx/s、steam以及switch2平台,并支持中文语言。近日,有网友晒出对比截图,将原版、wii版与即将推出的重制版进行了画面对比。 从图片可以看出,相较于原版和Wii版本,重制版在视觉表现上实现了巨大飞跃…

    2026年9月22日 用户投稿
    300
  • 好用的终端复用神器-Tmux

    好用的终端复用神器-Tmux好用的终端复用神器-Tmux好用的终端复用神器-Tmux好用的终端复用神器-Tmux

    前言 许久之前就听说过tmux,但是一直没上手,直到最近需要一直在linux下完成一些任务,我才切实感受到了tmux的优点:任意分屏、保存工作 就单单这两点,就足够实用了。分屏,曾今还十分痴迷i3wm和dwm这样的窗口管理工具,尤其是dwm的操作逻辑,大大提升linux工作效率。其他详情可以查看阮一…

    2026年9月22日 用户投稿
    200
  • Swift 3到5.1新特性整理

    tocSwift 5.1Swift 5.0Result类型Raw string自定义字符串插值动态可调用类型处理未来的枚举值从try?抹平嵌套可选检查整数是否为偶数字典compactMapValues()方法撤回的功能: 带条件的计数Swift 4.2CaseIterable协议警告和错误指令动态查…

    2026年9月22日
    100
  • php-gd怎么制作缩略图_php-gd生成高质量缩略图

    使用PHP-GD生成高质量缩略图需保持宽高比、选用imagecopyresampled进行重采样,并合理设置JPEG质量(80-95),同时处理PNG透明通道,避免图像失真或背景变黑。 使用 PHP-GD 制作高质量缩略图,核心在于正确处理图像缩放、保持宽高比、避免失真,并选择合适的图像质量参数。下…

    2026年9月22日
    000
  • NFV中:DPDK与SR-IOV应用场景及性能对比

    NFV中:DPDK与SR-IOV应用场景及性能对比NFV中:DPDK与SR-IOV应用场景及性能对比NFV中:DPDK与SR-IOV应用场景及性能对比NFV中:DPDK与SR-IOV应用场景及性能对比

    关于作者 作者简介: 张帅,Wechat:yorkszhang 网站:www.flowlet.net DPDK和SR-IOV目前主要用于提升IDC(数据中心)中的网络数据包处理速度。然而,在NFV(网络功能虚拟化)场景下,DPDK与SR-IOV各自的应用场景和优缺点是什么呢?本文将从以下几个方面来探…

    2026年9月22日 用户投稿
    000
  • PHP如何锐化图片效果_PHP对图片进行锐化处理

    PHP通过GD库或Imagick扩展实现图片锐化,核心是利用卷积算法增强边缘对比度;GD库使用imageconvolution()函数配合锐化矩阵处理,适合基础需求,而Imagick支持更精细的非锐化蒙版等高级算法,效果更优但需额外安装;锐化能提升视觉质量和用户体验,间接有利于SEO,但需避免过度锐…

    2026年9月22日
    300
  • PHP 表单验证:确保 HTML select 下拉菜单已正确选择非默认选项

    本文将详细介绍如何在 PHP 后端对 HTML select 下拉菜单进行有效验证,确保用户选择了非默认选项。我们将探讨常见的验证误区,并提供一个简洁高效的解决方案,通过检查 $_POST 数据来判断用户是否已做出有效选择,从而避免表单提交无效数据,提升用户体验和数据准确性。 在构建 web 表单时…

    2026年9月22日
    300
  • Online Config VS Code

    Online Config VS CodeOnline Config VS CodeOnline Config VS CodeOnline Config VS Code

    run vs view Install Code Server Update Code Server Database:It is recommended to create a Docker container for the database. Code Language: JavaScript…

    2026年9月21日 用户投稿
    200
  • 《如龙 极3》与峰义孝为主角《如龙3外传》等新情报发表

    《如龙 极3》与峰义孝为主角《如龙3外传》等新情报发表《如龙 极3》与峰义孝为主角《如龙3外传》等新情报发表《如龙 极3》与峰义孝为主角《如龙3外传》等新情报发表《如龙 极3》与峰义孝为主角《如龙3外传》等新情报发表

    世嘉公开《如龙极3/如龙3外传  dark ties》官方中文版预告宣传片,将于2026年2月12日发售 ​​​​,登陆ps5/ps4/switch2/xbox/pc平台,全球同步推出。 ​​​ 在2009年于PS3平台发售的《如龙3》焕然重生,为您打造“极致体验”。鲜活真实的冲绳街景、震撼力升级的…

    2026年9月21日 用户投稿
    100
  • 《如龙 极》《极2》 PS5、XSX|S版12月8日发售 支持中文

    《如龙 极》《极2》 PS5、XSX|S版12月8日发售 支持中文《如龙 极》《极2》 PS5、XSX|S版12月8日发售 支持中文《如龙 极》《极2》 PS5、XSX|S版12月8日发售 支持中文《如龙 极》《极2》 PS5、XSX|S版12月8日发售 支持中文

    来源:官方 Nintendo Switch™ 2平台游戏《人中之龙 极2》(预计2025年11月13日发售)数字版已于今日9月24日正式开启预购。 同时,《人中之龙 极》与《人中之龙 极2》的PlayStation®5及Xbox Series X|S版本将于2025年12月8日推出。此次新版本将新增…

    2026年9月21日 用户投稿
    000

发表回复

登录后才能评论
关注微信