2016-03-22 2 views
1

Я использую RecyclerView и выбираю объекты из API пакетами по десять. Для разбивки на страницы я использую EndlessRecyclerOnScrollListener и следую этому руководству Endless RecyclerView.

Моя проблема: при прокрутке программы добавляется индикатор выполнения и удаляется после получения данных с сервера. Но в моем случае это не сработает. ProgressBar еще скачиванииEndless RecyclerView - индикатор выполнения не исчезает

Endless RecyclerView

Метод, который выбираемых данных

private void makeJsonObjectRequest(int startList,int endList,final JsonObjectListener listener) { 
      JsonArrayRequest movieReq = new JsonArrayRequest(url, 
        new Response.Listener<JSONArray>() { 
         @Override 
         public void onResponse(JSONArray response) { 
          Log.d(TAG, response.toString()); 
          i = startLsit; 
          while(i < endList) { 
           try { 
            JSONObject obj = response.getJSONObject(i); 
            Movie movie = new Movie(); 

            /***** TONS OF CODE *****/ 

             movieList.add(movie); 
            } 

            } 
           } catch (JSONException e) { 
            e.printStackTrace(); 

           } 
           i++; 
           lastNumber = i; 
          } 
          mAdapter.notifyDataSetChanged(); 
          listener.onDone(lastNumber); 
         } 
        }, new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        VolleyLog.d(TAG, "Error: " + error.getMessage()); 

       } 
      }); 
      AppController.getInstance().addToRequestQueue(movieReq); 

     } 

Место, где я использую метод:

makeJsonObjectRequest(0, 9, new JsonObjectListener() { 
         @Override 
         public void onDone(int lastNumberI) { 
          lastNumber = lastNumberI; 
         } 

         @Override 
         public void onError(String error) { 

         } 
        }); } 

    mAdapter = new RVAdapter(getContext(),movieList,this,mRecyclerView); 
     mAdapter.setClickListener(this); 
     mRecyclerView.setAdapter(mAdapter); 

     mAdapter.setOnLoadMoreListener(new OnLoadMoreListener() { 
      @Override 
      public void onLoadMore() { 
       movieList.add(null); 
       mAdapter.notifyItemInserted(movieList.size()-1); 
       handler.postDelayed(new Runnable() { 
        @Override 
        public void run() { 
         // remove progress item 
         movieList.remove(movieList.size()-1); 
         mAdapter.notifyItemRemoved(movieList.size()); 
         //add items one by one 
         int start = lastNumber; 
         int end = start + 9; 
         makeJsonObjectRequest(start, end, new JsonObjectListener() { 
          @Override 
          public void onDone(int lastNumberI) { 
           lastNumber = lastNumberI; 
          } 

          @Override 
          public void onError(String error) { 

          } 
         }); 
         mAdapter.setLoaded(); 
        } 
       }, 2000); 
      } 
     }); 

Мой адаптер как этот Endless RecyclerView

+0

Случалось ли это каждый раз? –

+0

@JacksonChengalai Да, каждый раз –

ответ

1

После получения ответа, вы должны удалить это null объект видео и уведомлять адаптер

private void makeJsonObjectRequest(int startList,int endList,final JsonObjectListener listener) { 
      JsonArrayRequest movieReq = new JsonArrayRequest(url, 
        new Response.Listener<JSONArray>() { 
         @Override 
         public void onResponse(JSONArray response) { 
          Log.d(TAG, response.toString()); 
         movieList.remove(movieList.size()-1); 
         mAdapter.notifyItemRemoved(movieList.size()); 
          i = startLsit; 
          while(i < endList) { 
           try { 
            JSONObject obj = response.getJSONObject(i); 
            Movie movie = new Movie(); 

            /***** TONS OF CODE *****/ 

             movieList.add(movie); 
            } 

            } 
           } catch (JSONException e) { 
            e.printStackTrace(); 

           } 
           i++; 
           lastNumber = i; 
          } 
          mAdapter.notifyDataSetChanged(); 
          listener.onDone(lastNumber); 
         } 
        }, new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        VolleyLog.d(TAG, "Error: " + error.getMessage()); 

       } 
      }); 
      AppController.getInstance().addToRequestQueue(movieReq); 

     } 
+0

Я уже делаю это: фильмList.remove (movieList.size() - 1); mAdapter.notifyItemRemoved (movieList.size()); –

+0

после получения ответа вы должны удалить этот вид. Он работает для меня. Также проверьте ваш getItemViewType в вашем recyclerview. –

+0

. Я замечаю интересные вещи: когда я медленно прокручиваю прогресс, не запускаюсь, но когда я прокручиваю быстрее, это остается. В отладке я увидел, что при прокрутке более быстрого метода onLoadMore повторяет –

Смежные вопросы