将多个 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:12
下一篇 2025年11月5日 19:49:50

相关推荐

  • 币圈空投是真的吗?币圈空投网址大全

    本文将简要介绍怎样判断空投真实性的方法,并推荐一些靠谱的空投平台和资源,帮助你安全参与和学习操作流程。 如何判断空投是否真实 以下步骤可以帮助辨别真假: 1、核实官方来源:查看项目官网、X/Twitter、Telegram或Discord官方发布渠道,绝不通过非官方链接参与。 2、不提供私钥或助记词…

    2025年12月8日
    000
  • Fragmetric(FRAG)是什么?怎么样?FRAG代币经济与未来前景分析

    目录 什么是 Fragmetric (FRAG)?Fragmetric 与 FRAG 代币的区别Fragmetric 解决了哪些问题?1. 传统 Staking 的资金效率低下2. 网络安全碎片化3. 复杂的产量优化4. DeFi 中的社区治理有限Fragmetric 的历史和背景Fragmetri…

    2025年12月8日 好文分享
    000
  • 2025年UNI币还值得买吗?一文解析Uniswap的机会与风险

    目录 Uniswap 最新进展与V4 升级UNI 代币的潜力与限制UNI 代币的三大亮点投资UNI 的潜在限制与风险:UNI与其他主流DeFi 协议的比较理性评估UNI 投资价值‍ Uniswap 最新进展与V4 升级 Uniswap Labs 于2025 年初推出了V4 升级,带来多项底层架构创新…

    2025年12月8日
    000
  • 马里奥卡丁车世界的新机制完全破坏了

    nintendo的switch 2平台本月初正式推出,而《mario kart world》便是首批随主机一同发售的游戏之一。 这款被寄予厚望的Mario Kart系列新作却在玩家群体中引发了巨大争议。许多用户反馈称游戏存在严重问题,甚至有人直言它“完全崩了”。 尽管本作引入了多种全新机制,旨在提升…

    2025年12月8日
    000
  • 如何在马里奥卡丁车界种植硬币以解锁每辆车

    要解锁《马里奥卡丁车》中的所有车辆,您总共需要收集3,000枚硬币。 每获得100枚硬币就可以解锁一辆新卡丁车——而每场比赛大约只能获得25枚硬币,这个过程可能相当漫长。如果您希望在一小时之内完成全部解锁,其实有一种效率更高的方法可以实现快速刷币。 在自由漫游模式中,会有一些随机刷新的车辆,它们每隔…

    2025年12月8日
    000
  • 加密市场在周末进行价格更正,将比特币和以太坊陷入损失

    近期加密货币市场经历了一轮调整,多数加密资产出现下滑趋势。 上周末,加密市场的价格修正引起了广泛关注,导致大部分加密货币周一继续承压。比特币较前值下跌约2%,跌破105,000美元(约896万卢比)。据Coindcx和Coinswitch数据,作为历史最长、价值最高的加密货币,比特币跌幅达0.65%…

    2025年12月8日
    000
  • 加密货币中的费用开关是什么意思?

    区块链上的费用开关是什么意思?有什么作用?费用开关是协议为优化经济模型设计的一种调节手段,可以用来提升治理代币的价值捕获能力,增强协议的盈利能力。下文将以不同协议的费用开关设计和其影响详细说明费用开关对于defi设计的意义。 下面,小编给大家详细介绍下费用开关吧! 什么是费用开关? 费用开关(Fee…

    2025年12月7日
    000
  • JavaScript响应式编程与Observable

    Observable是响应式编程中处理异步数据流的核心概念,它允许随时间推移发出多个值,支持订阅、操作符链式调用及统一错误处理,广泛应用于事件监听、状态管理和复杂异步逻辑,提升代码可维护性与可读性。 响应式编程是一种面向数据流和变化传播的编程范式。在前端开发中,尤其面对复杂的用户交互和异步操作时,J…

    2025年12月6日 web前端
    000
  • 使用 String 和 Enum 的 Switch Case 详解

    本文详细讲解了如何在 Java 中结合 String 和 Enum 类型进行 switch case 操作。重点介绍了如何将字符串转换为 Enum 类型,以及如何在 switch 语句中使用 Enum。同时,探讨了分离关注点的原则,并提供了一个完整的示例,展示了如何将字符串到 Enum 的映射与实际…

    2025年12月6日 java
    000
  • 美女动作新游《铁甲少女》疑似被和谐!角色模型出现变化

    由yuke’s工作室打造,d3publisher发行的动作射击游戏《铁甲少女》已于今日(10月23日)正式登陆ps5、switch 2及pc平台,开启全身武装化的“机械少女”战斗之旅。玩家将操控经过义体改造的高中女生,闯入百层企业摩天大楼,展开一场融合直播元素与复仇剧情的爽快破坏行动,体…

    2025年12月6日 游戏教程
    000
  • NS版《小小梦魇3》十月更新补丁发布

    bandai namco 与 supermassive games 近日宣布,恐怖解谜合作游戏《小小梦魇 iii》即将迎来一项全新的“十月更新”,为玩家带来多方面的优化与改进。 本作于本月正式发售,而此次补丁预计将于2025年10月31日在任天堂Switch平台上线,涵盖游戏性、在线功能、视觉表现以…

    2025年12月6日 游戏教程
    000
  • 数毛社实测PS5节能省电模式:功耗暴降55%

    近日,著名技术评测机构数毛社(digital foundry)对ps5最新系统固件中引入的“省电模式”展开深入实测。结果显示,虽然该功能对当前主机用户的实际意义较为有限,但其背后的技术方向或许正为索尼下一代便携式ps6设备铺路。 实机测试: 本次测试选用了两款已适配省电模式的游戏作品——《恶魔之魂》…

    2025年12月6日 游戏教程
    000
  • 《深海迷航》手机版与其他平台运行状况对比:博主称其游戏体验远超NS版

    近日,热门深海沙盒生存游戏《深海迷航》正式上线手机平台,知名游戏博主el analista de bits对手机版与switch和ps5版本进行了详细对比,一起来了解一下! 视频欣赏: 从实际演示来看,尽管在画面细节上有所缩减,但《深海迷航》手机版整体帧数表现稳定,操作体验也较为流畅。该博主表示,本…

    2025年12月5日 游戏教程
    000
  • PHP move_uploaded_file 失败:权限问题解析与解决方案

    本文详细解析了PHP中使用move_uploaded_file函数上传文件时,因Permission denied错误导致文件保存失败的常见问题。教程将深入探讨该错误的根本原因——目标目录的写入权限不足,并提供了针对Linux/Unix系统下文件权限配置的实用解决方案,确保PHP文件上传功能稳定运行…

    2025年12月5日
    000
  • JS怎么实现悬浮窗拖拽 4行代码让元素支持鼠标自由拖拽

    js实现悬浮窗拖拽的核心是监听鼠标事件并更新位置。1. 优化性能:使用transform: translate()替代left和top以启用gpu加速,并通过节流函数限制mousemove触发频率;2. 限制范围:在mousemove中计算悬浮窗位置,确保不超出屏幕边界;3. 处理事件冲突:mous…

    2025年12月5日 web前端
    000
  • js中if条件太多会不会影响性能

    if条件过多可能影响javascript性能,但关键在于内部代码的效率。优化方法包括:1.用switch语句替代多个if判断,提升清晰度与执行速度;2.使用查找表(lookup table)实现快速条件匹配;3.重构逻辑减少冗余判断,利用短路求值避免不必要的操作;4.拆分复杂条件表达式并调整顺序以优…

    2025年12月5日 web前端
    000
  • js中如何用策略模式替换条件判断

    策略模式通过将条件判断逻辑封装为独立策略类,使代码更清晰、易维护。1.定义策略接口,声明算法方法;2.创建具体策略类实现接口;3.环境类持有策略并执行;4.客户端通过环境类动态选择策略。适用于多条件分支且频繁变动的场景,如订单折扣、支付方式等。优点是符合开闭原则,缺点是类数量增加,客户端需了解所有策…

    2025年12月5日 web前端
    100
  • 告别订单管理混乱:如何利用Composer引入SprykerOMS打造高效订单流程

    可以通过一下地址学习composer:学习地址 订单管理的痛点:我曾被“状态”所困 作为一名开发者,我深知构建一个稳定、高效的电商系统有多么不易。其中,订单管理模块无疑是最核心也最复杂的环节之一。想象一下:用户下单、支付、仓库发货、物流配送、用户签收,这还只是一个顺利的流程。如果遇到支付失败、用户取…

    开发工具 2025年12月5日
    000
  • 《NBA®2K26 标准版》揭晓封面运动员

    nba 2k26的提前试玩将在8月29日启动,比原定于2025年9月5日的全球发售日期提前一周。 Nintendo Switch™2将推出次世代版本。 根据2K官方公布的消息,三届全明星、俄克拉荷马雷霆队的当家控卫Shai Gilgeous Alexander,作为2024-25赛季常规赛MVP及N…

    2025年12月5日
    000
  • java中的enum代表什么 枚举enum的4个实用技巧提升代码质量

    java中的enum本质上是限制实例化的特殊类,用于提升代码可读性、类型安全性和可维护性。1. 使用values()方法可遍历所有枚举值,避免手动维护列表带来的错误;2. valueof()方法实现字符串到枚举常量的转换,但需处理非法输入引发的异常;3. 枚举可添加字段和方法,封装更多逻辑,如定义抽…

    2025年12月5日 java
    000

发表回复

登录后才能评论
关注微信