【发布时间】:2016-11-07 18:09:51
【问题描述】:
我有一个班级CheckList。它有checkListId、title 和CheckListItemArrayList。
我有 2 个异步任务。一个用于GetCheckLists,另一个用于GetCheckListItems。在CheckList 类中,它有checkListId、Title 和arrayList 的checkListItems。
首先,我使用GetCheckListAsyncTask 获取所有检查列表。现在对于每个清单,我都调用GetCheckListItemsAsync 任务来获取所有checkListItems。
现在GetCheckListItemsAsyncTask 的onPostExecute 方法我想将checkListItemArrayList 设置为CheckList 的对象。
检查列表活动:
public class CheckListActivity extends AppCompatActivity implements CheckListAdapter.OnItemClickListener{
public int iterationCount = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_check_list);
mIntent = getIntent();
checkListArrayList = new ArrayList<>();
tempCheckListIdList = new ArrayList<>();
mEventId = mIntent.getStringExtra("eventId");
mCheckList = new CheckList();
progressDialog = new ProgressDialog(CheckListActivity.this);
recyclerView = (RecyclerView)findViewById(R.id.recycler_view);
mAdapter = new CheckListAdapter(checkListArrayList,CheckListActivity.this,CheckListActivity.this);
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
recyclerView.setLayoutManager(mLayoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(mAdapter);
GetCheckListAsyncTask getCheckListAsyncTask = new GetCheckListAsyncTask();
getCheckListAsyncTask.execute(mEventId);
}
public class GetCheckListsItemAsyncTask extends AsyncTask<String, Void, JSONObject> {
private String api;
private JSONObject jsonParams;
public GetCheckListsItemAsyncTask(){}
@Override
protected JSONObject doInBackground(String... params) {
try {
api = getResources().getString(R.string.server_url) + "api/checklist_items/getChecklistItems.php";
jsonParams = new JSONObject();
String checklistId = params[0]; // params[0] is username
jsonParams.put("checklistId", checklistId);
ServerRequest request = new ServerRequest(api, jsonParams);
return request.sendRequest();
} catch(JSONException je) {
return Excpetion2JSON.getJSON(je);
}
} //end of doInBackground
@Override
protected void onPostExecute(JSONObject response) {
super.onPostExecute(response);
Log.e("ServerResponse", response.toString());
try {
int result = response.getInt("result");
String message = response.getString("message");
if (result == 1) {
Toast.makeText(CheckListActivity.this, message, Toast.LENGTH_LONG).show();
//code after getting profile details goes here
checkListsItemArray = response.getJSONArray("checklistItems");
for (int i = 0; i < checkListsItemArray.length(); i++) {
int pendingTasks = 0,completedTasks = 0;
itemList = new ArrayList<>();
CheckListItem checkListItem = new CheckListItem();
JSONObject subObject = checkListsItemArray.getJSONObject(i);
String checkListItemName = subObject.getString("text");//name of the attribute in response
checkListItem.setTitle(checkListItemName);
checkListItem.setBudget(checkListItemBudget);
itemList.add(checkListItem);//adding string to arraylist
}
CheckList checkList = new CheckList();
for(int i = 0; i <= iterationCount; i++ ) {
String checkListId = checkListArrayList.get(iterationCount).getCheckListId();
checkListArrayList.get(iterationCount).setCheckListItemArrayList(itemList);
}
mAdapter.notifyDataSetChanged();
}
else {
//code after failed getting profile details goes here
}
} catch(JSONException je) {
}
} //end of onPostExecute
}
public class GetCheckListAsyncTask extends AsyncTask<String, Void, JSONObject> {
private String api;
private JSONObject jsonParams;
public GetCheckListAsyncTask(){}
@Override
protected JSONObject doInBackground(String... params) {
try {
api = getResources().getString(R.string.server_url) + "api/checklist/getChecklists.php";
jsonParams = new JSONObject();
String eventId = params[0]; // params[0] is username
jsonParams.put("eventId", eventId);
ServerRequest request = new ServerRequest(api, jsonParams);
return request.sendRequest();
} catch(JSONException je) {
return Excpetion2JSON.getJSON(je);
}
} //end of doInBackground
@Override
protected void onPostExecute(JSONObject response) {
super.onPostExecute(response);
//Log.e("ServerResponse", response.toString());
try {
int result = response.getInt("result");
String message = response.getString("message");
if (result == 1 ) {
Toast.makeText(CheckListActivity.this, message, Toast.LENGTH_LONG).show();
//code after getting profile details goes here
checkListArray = response.getJSONArray("checklists");
for (int i = 0; i < checkListArray.length(); i++) {
CheckList checkList = new CheckList();
JSONObject subObject = checkListArray.getJSONObject(i);
String checkListName = subObject.getString("checklist");//name of the attribute in response
checkList.setCheckListTitle(checkListName);
checkList.setBudget(checkListBudget);
checkListArrayList.add(checkList);
if(checkListArrayList.size() > iterationCount) {
String checkListId1 = checkListArrayList.get(iterationCount).getCheckListId();
new GetCheckListsItemAsyncTask().execute(checkListId1);
iterationCount ++;
}
mAdapter.notifyDataSetChanged();
}
else {
Toast.makeText(CheckListActivity.this, message, Toast.LENGTH_LONG).show();
//code after failed getting profile details goes here
if ((progressDialog != null) && progressDialog.isShowing()) {
progressDialog.dismiss();
}
}
} catch(JSONException je) {
}
} //end of onPostExecute
}
}
为了获得checkListArrayList 的位置,我创建了一个迭代计数变量,并在GeckCheckListAsyncTask 的postExecute 方法中增加了它。并尝试在GetCheckListItemsAsyncTask 中访问它并在checkList 的对象中设置arraylist。
但是如果 GetCheckListItemAsyncTask 的 for 循环,它会抛出索引越界异常。我应该如何获取checkListArray 的索引以将CheckListItemArray 设置为checkListArrayList 的相同位置?
日志:
Process: com.example.siddhi.meavita, PID: 20503
java.lang.IndexOutOfBoundsException: Invalid index 5, size is 5
at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
at java.util.ArrayList.get(ArrayList.java:308)
at com.example.siddhi.meavita.Activities.CheckListActivity$GetCheckListsItemAsyncTask.onPostExecute(CheckListActivity.java:336)
at com.example.siddhi.meavita.Activities.CheckListActivity$GetCheckListsItemAsyncTask.onPostExecute(CheckListActivity.java:261)
【问题讨论】:
-
请贴出错误日志
-
添加了日志。请帮忙..谢谢..@Shank
-
336和261是哪些行 -
GetCheckListItemsAsyncTask 的 for 循环中的两行。 @Shank
-
我知道,在这里发布确切的行
标签: android arraylist android-asynctask position indexoutofboundsexception