
在Android开发中,有时我们需要在一个ListView中展示来自不同数据源的数据。直接使用两个不同的Adapter是不行的,我们需要创建一个自定义的Adapter来处理这种情况。以下是一种实现方案,它使用了ViewHolder模式,并且可以轻松地扩展到更多的数据源。虽然RecyclerView在性能和灵活性上更胜一筹,但ListView在某些场景下仍然适用,因此理解这种合并适配器的方法仍然很有价值。
1. 创建数据模型类
首先,定义代表不同数据类型的数据模型类。例如,基于问题描述,我们有两个数据源:customerLoanApplicationList 和 customerLoanList。我们需要定义相应的数据模型类:
public class LoanApplication {
// LoanApplication 的属性,例如:
private String applicationId;
private String applicantName;
// 构造函数、getter 和 setter 方法
public LoanApplication(String applicationId, String applicantName) {
this.applicationId = applicationId;
this.applicantName = applicantName;
}
public String getApplicationId() {
return applicationId;
}
public String getApplicantName() {
return applicantName;
}
}
public class Loan {
// Loan 的属性,例如:
private String loanId;
private double loanAmount;
// 构造函数、getter 和 setter 方法
public Loan(String loanId, double loanAmount) {
this.loanId = loanId;
this.loanAmount = loanAmount;
}
public String getLoanId() {
return loanId;
}
public double getLoanAmount() {
return loanAmount;
}
}2. 创建自定义适配器
立即学习“Java免费学习笔记(深入)”;
接下来,创建一个自定义的Adapter,它将处理两种类型的数据。我们需要定义不同的ViewHolder来对应不同的数据类型。
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.List;
public class CombinedAdapter extends BaseAdapter {
private Context context;
private List在这个Adapter中,我们定义了两个内部类 LoanApplicationViewHolder 和 LoanViewHolder,分别对应 LoanApplication 和 Loan 数据类型。getItemViewType() 方法根据数据类型返回不同的类型值,getViewTypeCount() 返回支持的类型总数。在 getView() 方法中,我们根据类型值来创建或复用相应的ViewHolder,并设置数据。
3. 定义布局文件
点触小程序是有南昌点触科技有限公司研发,我公司是国家级高新技术企业,本套源码是国内首家应该到目前为止也是独家用.netcore开发的小程序平台站,公司有三个开发组同时做小程序平台开发,一个php开发组,一个java开发组,一个.netcore开发组,三组独立并行开发。目前投入上线运营的未php版本,其他两组均是做封闭性开发测试,不对外公布。秉着互联网的合作,共享,开放,共赢的原则,我们将本套.NE
确保你已经创建了 item_loan_application.xml 和 item_loan.xml 布局文件,它们分别对应 LoanApplication 和 Loan 数据类型的显示。
- item_loan_application.xml:
- item_loan.xml:
4. 使用适配器
在Activity或Fragment中,创建数据列表,并将数据添加到ListView中。
import android.os.Bundle;
import android.widget.ListView;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private ListView listView;
private CombinedAdapter adapter;
private List dataList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = findViewById(R.id.list_view);
dataList = new ArrayList<>();
// 添加 LoanApplication 数据
dataList.add(new LoanApplication("APP001", "John Doe"));
dataList.add(new LoanApplication("APP002", "Jane Smith"));
// 添加 Loan 数据
dataList.add(new Loan("LOAN001", 10000.0));
dataList.add(new Loan("LOAN002", 20000.0));
adapter = new CombinedAdapter(this, dataList);
listView.setAdapter(adapter);
}
} 确保你已经创建了 activity_main.xml 布局文件,其中包含一个ListView。
注意事项和总结
- ViewHolder模式: 使用ViewHolder模式可以避免重复查找View,提高ListView的滚动性能。
- 数据类型判断: getItemViewType() 方法是关键,它决定了每个Item使用哪个ViewHolder和布局。
-
Object 类型: List
允许存储不同类型的数据,但需要进行类型转换。 - 布局文件: 确保为每种数据类型创建对应的布局文件。
- RecyclerView: 虽然本文展示了ListView的解决方案,但在新项目中,推荐使用RecyclerView,它提供了更好的性能和灵活性。RecyclerView同样可以使用多ViewHolder来实现类似的功能,而且更加高效。
- 错误处理: 在getItemViewType中,如果遇到未知的数据类型,应该返回一个默认值或者抛出异常,避免程序崩溃。
通过以上步骤,你就可以成功地将两个不同数据源的适配器合并到一个ListView中显示了。这种方法可以灵活地处理多种数据类型,并且可以方便地扩展到更多的数据源。记住,虽然ListView在某些场景下仍然适用,但在新项目中,推荐使用RecyclerView。









