解決RecyclerView中不同大小列表導致的IndexOutOfBoundsException

解決RecyclerView中不同大小列表導致的IndexOutOfBoundsException

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);         }     }); }

代碼解釋

  1. 邊界檢查: if (position
  2. 空值處理: 如果position超出范圍,available變量保持為null。
  3. 空值判斷: 在啟動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)聲明
THE END
喜歡就支持一下吧
點贊6 分享