0

0

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

霞舞

霞舞

发布时间:2025-07-15 18:02:19

|

346人浏览过

|

来源于php中文网

原创

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

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

实现方法:自定义 Adapter 和 ViewHolder

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

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

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

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

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

示例代码:

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

DreamStudio
DreamStudio

SD兄弟产品!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<Object> 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.xml
  • item_loan.xml

使用示例:

ListView listView = findViewById(R.id.listView);
CombinedAdapter adapter = new CombinedAdapter(this);

// 模拟数据
List<CombinedAdapter.LoanApplication> loanApplications = new ArrayList<>();
loanApplications.add(new CombinedAdapter.LoanApplication("John Doe", 10000.0));
loanApplications.add(new CombinedAdapter.LoanApplication("Jane Smith", 5000.0));

List<CombinedAdapter.Loan> loans = new ArrayList<>();
loans.add(new CombinedAdapter.Loan("L12345", 5.5));
loans.add(new CombinedAdapter.Loan("L67890", 6.0));

// 添加数据到 Adapter
adapter.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 时,要根据项目的具体需求和性能要求进行权衡。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

338

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

225

2025.10.31

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

138

2026.02.12

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1949

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2119

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

1172

2024.11.28

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1051

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

615

2024.08.29

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

49

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP基础入门课程
PHP基础入门课程

共33课时 | 2.3万人学习

前端系列快速入门课程
前端系列快速入门课程

共4课时 | 0.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号