在android RecyclerView中使用兩個不同大小的ArrayList(例如員工列表和可用性列表)時,由于索引超出范圍而導致的IndexOutOfBoundsException問題,我們可以通過在onBindViewHolder方法中進行邊界檢查來解決。
問題分析
問題在于RecycleViewAdapter的onBindViewHolder方法中,嘗試通過position同時訪問allEmployees和allAvailabilitys兩個列表。由于allEmployees的尺寸大于allAvailabilitys,當position超過allAvailabilitys的尺寸時,會拋出IndexOutOfBoundsException。
解決方案
核心思路是在訪問allAvailabilitys列表之前,先檢查position是否在allAvailabilitys的有效范圍內(nèi)。如果超出范圍,則提供一個默認值或者跳過相關操作。
修改RecycleViewAdapter的onBindViewHolder方法:
@Override public void onBindViewHolder(@NonNULL MyViewHolder holder, int position) { AvailabilityModel available = null; // 初始化為null if (position < allAvailabilitys.size()) { available = allAvailabilitys.get(position); } EmployeeModel employee = allEmployees.get(position); holder.employeeID.setText(String.valueOf(allEmployees.get(position).getEID())); holder.firstName.setText(allEmployees.get(position).getfName()); holder.lastName.setText(allEmployees.get(position).getlName()); //holder.position = position; holder.employee = employee; holder.editButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(context, EditEmployee.class); intent.putExtra("Editing", employee); context.startActivity(intent); } }); // 修改availabilityButton的點擊事件 holder.availabilityButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(context, availability_screen_code.class); intent.putExtra("Available", employee); // 只有當available不為null時才傳遞數(shù)據(jù) if (available != null) { intent.putExtra("Days", available); } else { // 可以傳遞一些默認值或者不傳遞,具體取決于你的業(yè)務邏輯 // 例如:intent.putExtra("Days", new AvailabilityModel(...)); } context.startActivity(intent); } }); holder.parentLayout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(context, ViewEmployee.class); intent.putExtra("Viewing", employee); context.startActivity(intent); } }); }
代碼解釋
- 邊界檢查: if (position
- 空值處理: 如果position超出范圍,available變量保持為null。
- 空值判斷: 在啟動availability_screen_code Activity之前,檢查available是否為null。如果為null,則不傳遞”Days” extra,或者傳遞一個默認的AvailabilityModel對象。這取決于你的具體業(yè)務邏輯,你需要決定在沒有可用性數(shù)據(jù)時如何處理。
其他考慮
- 默認值: 如果allAvailabilitys中缺少某個員工的可用性數(shù)據(jù),你可以考慮創(chuàng)建一個默認的AvailabilityModel對象,并在else分支中傳遞它。
- 錯誤提示: 如果缺少可用性數(shù)據(jù)對用戶體驗有影響,你可以在界面上顯示一條消息,提示用戶該員工的可用性信息缺失。
- 數(shù)據(jù)結(jié)構(gòu): 如果員工和可用性之間存在明確的對應關系,可以考慮使用map這樣的數(shù)據(jù)結(jié)構(gòu)來存儲數(shù)據(jù),這樣可以更方便地查找和管理數(shù)據(jù)。
總結(jié)
通過添加邊界檢查和空值處理,可以有效地避免IndexOutOfBoundsException,并確保RecyclerView在處理不同大小的列表時能夠正常工作。 在實際開發(fā)中,應根據(jù)具體的業(yè)務需求選擇合適的解決方案,并注意處理可能出現(xiàn)的空值情況。 同時,優(yōu)化數(shù)據(jù)結(jié)構(gòu)可以從根本上解決此類問題。
? 版權(quán)聲明
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載。
THE END