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.
- Cómo desplazar una actividad verticalmente en Android
- Vista de cuadrícula personalizada con rango de fila y extensión de columna
- Cómo habilitar el desplazamiento en un simpleadapter en el firmware X16 de Google Glass
- Mantener la posición de desplazamiento con cada actualización en la vista de lista
- Desplazamiento sobre lienzo grande
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)
- Navegador predeterminado de Android que no se desplaza en la página web
- Agregar una vista de pie de página nativa a la vista web
- Android: ¿Cómo obtener el actual desplazamiento X de RecyclerView?
- ¿Cómo desplazar una vista de lista expandible hasta su final?
- Android scroll down
- Cómo hacer desplazamiento circular en ViewPager?
- JQuery móvil deshabilitar el contenido de la página desplazamiento vertical
- Desplazamiento por programación de una palabra en vista en una vista de texto
- Cómo implementar un organigrama en android
- El anuncio de Mopub no se muestra cuando se utiliza un ID de grupo de anuncios personal