如何将ArrayList<String>与ArrayList<Integer>整合为单个Adapter适配ListView并解决构造报错
问题原因说明
1. 构造器报错的直接原因
你声明的泛型是ArrayAdapter<CombineData>,但构造方法最后一个参数传入的是stepsList(String类型ArrayList),类型完全不匹配,所以找不到对应构造器。
另外你当前的CombineData设计不符合需求:你把两个完整的列表塞进了单个CombineData对象,但适配器需要的是每一行对应一个CombineData实例,每个实例存储单条数据的位置和步骤内容。
2. 合并两个Adapter的可行性
可以合并,你原本用两个ListView分别展示一列数据,合并后只需要一个ListView,每行的布局同时放两个控件分别展示位置和步骤内容即可。注意系统默认的ArrayAdapter仅支持给单个TextView自动赋值,你有两个控件需要绑定数据,必须重写getView方法自行处理赋值逻辑。
具体实现步骤
第一步:修正CombineData类
调整为单条数据对应单个实例的结构:
public class CombineData { // 存储单条数据的步骤详情和位置,而非存储完整列表 private String stepDetail; private Integer stepPos; public CombineData(String stepDetail, Integer stepPos){ this.stepDetail = stepDetail; this.stepPos = stepPos; } public String getStepDetail() { return stepDetail; } public void setStepDetail(String stepDetail) { this.stepDetail = stepDetail; } public Integer getStepPos() { return stepPos; } public void setStepPos(Integer stepPos) { this.stepPos = stepPos; } }
第二步:组装合并后的数据源
确保两个原有列表长度一致后,按位置拼接为CombineData的列表:
ArrayList<CombineData> combineDataList = new ArrayList<>(); for (int i = 0; i < stepsList.size(); i++) { combineDataList.add(new CombineData(stepsList.get(i), stepsPosList.get(i))); }
第三步:自定义适配器
重写getView方法完成两个控件的赋值,加入ViewHolder做性能优化:
public class CombineStepsAdapter extends ArrayAdapter<CombineData> { private final int itemLayoutId; public CombineStepsAdapter(Context context, int layoutId, List<CombineData> dataList) { super(context, layoutId, dataList); itemLayoutId = layoutId; } @Override public View getView(int position, View convertView, ViewGroup parent) { CombineData currentData = getItem(position); View itemView; ViewHolder viewHolder; if (convertView == null) { itemView = LayoutInflater.from(getContext()).inflate(itemLayoutId, parent, false); viewHolder = new ViewHolder(); viewHolder.etStepsDetails = itemView.findViewById(R.id.etStepsDetails); viewHolder.tvStepsPosition = itemView.findViewById(R.id.tvStepsPosition); itemView.setTag(viewHolder); } else { itemView = convertView; viewHolder = (ViewHolder) itemView.getTag(); } // 分别给两个控件赋值 viewHolder.etStepsDetails.setText(currentData.getStepDetail()); viewHolder.tvStepsPosition.setText(String.valueOf(currentData.getStepPos())); return itemView; } static class ViewHolder { TextView etStepsDetails; TextView tvStepsPosition; } }
第四步:绑定适配器到ListView
CombineStepsAdapter stepsAdapter = new CombineStepsAdapter(this, R.layout.steps_item, combineDataList); stepsView.setAdapter(stepsAdapter); // 原本的stepsView2和第二个适配器可以直接移除,所有数据已合并到同一个ListView展示
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

