Array Index fuera de límite cuando se desplaza la vista de lista rápidamente mientras se actualizan los datos desde el servidor

Tengo una vista de lista que se actualiza con los artículos que vienen del servidor.

En esta vista de lista tengo carga más funcionalidad y bajar para actualizar ambos.

Todo está funcionando bien, pero el problema es cuando me tire hacia abajo para actualizar y y se desplaza el listview rápido que se bloquea lo que estoy haciendo mal que no entiendo.

Aquí está mi código

lv.setOnScrollListener(new AbsListView.OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { //what is the bottom iten that is visible int lastInScreen = firstVisibleItem + visibleItemCount; if (lastInScreen != 0) { if ((lastInScreen == totalItemCount) && !(isLoading)) {// && !(loadingMore)){ if (newsList.size() < total) { if (isNetworkAvailable()) { if (!isLoading) { lv.addFooterView(footerView); getNews(); } } } else { lv.removeFooterView(footerView); } } } } }); 

Este es mi método OnRefresh

 @Override public void onRefresh() { super.onRefresh(); if (!isLoading) { // no query to server is executing if (isNetworkAvailable()) { isLoading = true; clearList = true; pageNumber = 0; getNews(); } else { toast(getString(R.string.no_internet)); swipeRefreshLayout.setRefreshing(false); } } else {// a query is already server is executing swipeRefreshLayout.postDelayed(new Runnable() { @Override public void run() { swipeRefreshLayout.setRefreshing(false); } }, 1000); } } private void getNews() { pageNumber += 1; isLoading = true; JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.GET, urlNews + pageNumber, null, this, this); applicationInstance.addToRequestQueue(jsonObjReq, "News"); } @Override public void onResponse(JSONObject jsonObject) { super.onResponse(jsonObject); new SaveData().execute(jsonObject); } public class SaveData extends AsyncTask<JSONObject, Void, Void> { @Override protected Void doInBackground(JSONObject... params) { JSONObject jsonObject = params[0]; try { if (jsonObject.getInt("success") == 1) { if (clearList) { newsList.clear(); } JSONArray newsArray = jsonObject.getJSONArray("rooms"); total = jsonObject.getJSONObject("paging").getInt("total"); for (int a = 0; a < newsArray.length(); a++) { JSONObject obj = newsArray.getJSONObject(a); int roomID = obj.getInt("id"); String title = obj.getString("name"); String descr = obj.getString("descr"); RoomsData room = Select.from(RoomsData.class).where(Condition.prop("room_id").eq(roomID)).first(); if (room == null) { room = new RoomsData(roomID, title, descr); room.save(); } else { room.name = title; room.description = descr; room.save(); } JSONArray imagesArray = obj.getJSONArray("images"); for (int b = 0; b < imagesArray.length(); b++) { JSONObject imageObj = imagesArray.getJSONObject(b); String Imagename = imageObj.getString("name"); String url = imageObj.getString("url"); HotelImages.deleteAll(HotelImages.class, "room_id = ? and name = ? and url = ? ", roomID + "", Imagename, url); HotelImages image = new HotelImages(0, roomID, 0, 0, 0, 0, 0, Imagename, url); image.save(); room.imageList.add(image); } // tempList.add(room); newsList.add(room); } store.setString(Constants.FACILITIES_AVAILABLE, jsonObject.getJSONArray("facilities").toString()); store.setString(Constants.BOOKING_EMAIL, jsonObject.getJSONObject("reservation").getString("email")); } } catch (Exception e) { } finally { } return null; } @Override protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); runOnUiThread(new Runnable() { @Override public void run() { setListView(); isLoading = false; swipeRefreshLayout.setRefreshing(false); } }); } } private void setListView() { if (newsList.size() == 1) { Intent it = new Intent(RoomsActivity.this, RoomDetailActivity.class); RoomsData pro = newsList.get(0); it.putExtra("RoomID", pro.roomID); //it.putExtra("rat",rat); startActivity(it); finish(); } else { if (clearList) { clearList = false; adapterRooms = new AdapterRooms(this, newsList); lv.setAdapter(adapterRooms); if (adapterRooms == null) { adapterRooms = new AdapterRooms(this, newsList); lv.setAdapter(adapterRooms); } else { adapterRooms.notifyDataSetChanged(); } } else { adapterRooms.notifyDataSetChanged(); } } swipeRefreshLayout.setRefreshing(false); lv.removeFooterView(footerView); } 

Esta es la excepción que estoy recibiendo

 01-08 12:45:08.377 2373-2373/hotels.soulvant E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: hotels.soulvant, PID: 2373 java.lang.IndexOutOfBoundsException: Invalid index 5, size is 0 at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) at java.util.ArrayList.get(ArrayList.java:308) at android.widget.HeaderViewListAdapter.getView(HeaderViewListAdapter.java:225) at android.widget.AbsListView.obtainView(AbsListView.java:2346) at android.widget.ListView.makeAndAddView(ListView.java:1875) at android.widget.ListView.fillDown(ListView.java:702) at android.widget.ListView.fillGap(ListView.java:666) at android.widget.AbsListView.trackMotionScroll(AbsListView.java:5029) at android.widget.AbsListView$FlingRunnable.run(AbsListView.java:4577) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858) at android.view.Choreographer.doCallbacks(Choreographer.java:670) at android.view.Choreographer.doFrame(Choreographer.java:603) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.