设置适配器后添加项目时,防止ArrayIndexOutOfBoundsException

时间:2018-12-29 13:55:58

标签: android android-recyclerview

这是我的$(document).ready(function(){ // code to get all records from table via select box $("#employee").change(function() { var id = $(this).find(":selected").val(); var dataString = 'empid='+ id; $.ajax({ url: 'getEmployee.php', dataType: "json", data: dataString, cache: false, success: function(employeeData) { if(employeeData) { $("#heading").show(); $("#no_records").hide(); $("#emp_name").text(employeeData.employee_name); $("#emp_age").text(employeeData.employee_age); $("#emp_salary").text(employeeData.employee_salary); $("#records").show(); } else { $("#heading").hide(); $("#records").hide(); $("#no_records").show(); } } }); }) }); 代码:

<?php
include_once("db_connect.php");
if($_REQUEST['empid']) {
$sql = "SELECT id, employee_name, employee_salary, employee_age FROM 
employee WHERE id='".$_REQUEST['empid']."'";
$resultset = mysqli_query($conn, $sql) or die("database error:". 
mysqli_error($conn));
$data = array();
while( $rows = mysqli_fetch_assoc($resultset) ) {
$data = $rows;
}
echo json_encode($data);
} else {
echo 0;
}
?>

这是我的代码,用于将数据添加到RecyclerView:

onBindViewHolder

上面的代码不起作用,我得到@Override public void onBindViewHolder(MyViewHolder holder, int position) { myHolder = holder; text = mDataset.get(keys[position]); myHolder.singleItemTextView.setText(text); } 。但是当我在使用 mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view); mRecyclerView.setHasFixedSize(true); mLayoutManager = new LinearLayoutManager(this); mRecyclerView.setLayoutManager(mLayoutManager); myDataset = new LinkedHashMap<>(); mAdapter = new HashMapAdapter(myDataset); mRecyclerView.setAdapter(mAdapter); myDataset.put("1", "Hello"); myDataset.put("2", "World"); mAdapter.notifyDataSetChanged(); 之前放入数据时,一切都正常了:

java.lang.ArrayIndexOutOfBoundsException: length=0; index=0

如何首先设置适配器,然后添加项目而不会出现此错误?之所以需要它,是因为我动态添加了项,并且起初数据集为空,所以我将适配器设置为空数据集。

1 个答案:

答案 0 :(得分:0)

如果您知道将遇到错误(在这种情况下为异常),则应使用 try and catch 块来捕获异常。这样,您将能够像正常情况一样继续正常运行,因为您的应用程序不会因异常而崩溃。

try{
    mAdapter = new HashMapAdapter(myDataset);
    mRecyclerView.setAdapter(mAdapter);
}catch(ArrayIndexOutOfBounds ex){
    Log.e(TAG, "Exception: " + ex);
}

您也许可以从根本上解决问题。我认为在适配器类中设置位置时会遇到异常,如果arrayList为空,它将遇到 ArrayIndexOutOfBounds 。作为例外统计信息java.lang.ArrayIndexOutOfBoundsException: length=0; index=0,这意味着您在数组的大小/长度为0时尝试访问位置1(索引= 0)。在尝试访问不存在的内容。

解决此问题的另一种方法是在访问数组之前检查索引是否在数组的边界内(0到数组的长度减去1)。例如:

if( index >= 0 && index < array.length){
    //safe to access the array
} else {
   //not safe to access the array as you'll encounter exception
}