2016-10-24 2 views
0

나는 다른 답변을 보려고했지만 내 사례는 다루지 않습니다. 무한 스크롤로 recyview에 항목을로드 할 때마다 내 recyclerview에서 오류가 발생합니다. 때때로 그것은 리사이클 러뷰에 아이템을로드하고, 다른 시간에는 아래와 같이 logcat에 메시지가 주어진다면 리사이클 뷰를 공백으로 남겨 둡니다.Recycleview notifyDataSetChanged() erro

IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling 

itemAdapter.setOnLoadMoreListener(new Schoolarship_Adapter.OnLoadMoreListener() { 
     @Override 
     public void onLoadMore() { 
      listItem.add(null); 
      itemAdapter.notifyItemInserted(listItem.size() - 1); 

      final Handler handler = new Handler(); 

      final Runnable r = new Runnable() { 
       @Override 
       public void run() { 
        listItem.remove(listItem.size() - 1); 
        itemAdapter.notifyItemRemoved(listItem.size()); 

        ++pagenumber; 
        new RetrieveItems().execute(); 
        System.out.println("working now i guess"); 

        itemAdapter.notifyDataSetChanged(); 
        itemAdapter.setLoaded(); 

       } 
      }; 

      handler.post(r); 
     } 
    }); 

내 어댑터,

Schoolarship_Adapter(Context cont, List<Schoolarship> items, @NonNull RecyclerView rv){ 
    context = cont; 
    listItems = items; 

    if((rv.getLayoutManager() instanceof LinearLayoutManager)) { 
     final LinearLayoutManager gm = (LinearLayoutManager) rv.getLayoutManager(); 
     rv.setOnScrollListener(new RecyclerView.OnScrollListener() { 
      @Override 
      public void onScrolled(RecyclerView recyclerView, int dx, int dy){ 
       super.onScrolled(recyclerView, dx, dy); 
       totalItemCount = gm.getItemCount(); 
       lastVisibleItem = gm.findLastVisibleItemPosition(); 
       if(!loading &&totalItemCount <= (lastVisibleItem + visibleThreshold)){ 
        if(onLoadMoreListener!=null){ 
         onLoadMoreListener.onLoadMore(); 
        } 
        loading = true; 
       } 
      } 
     }); 
    } 
} 

Pls는

처럼 보이는 이유를 난 아직도 내가이 응용 프로그램을 실행하는 오류가 각 시간을 얻을 않는 응용 프로그램의 나의 수준은?

+0

'새로운 RetrieveItems 일을 실행할 수 있음'데이터를로드? –

+0

예 내 데이터를로드하지 않습니다 –

+0

왜 그 문장 뒤에'notifyDataSetChanged'가 생깁니 까? 이 아이디어는 ** 데이터가 완전히로드 된 후 ** 어댑터에 알립니다. 거기에 통보하면 데이터가 완전히로드되지 않습니다. 'AsyncTask'' RetrieveItems'의'onPostExecute' 메소드 안에'notifyDataSetChanged'를 써야합니다. –

답변

0

이유는 onLoadMore() 입니다. 새 항목을 추가 /로드 할 때 recyclerView의 높이를 계산하므로 notifyDataSetChanged를 주면 분명히 예외가 발생합니다. ()이이().

protected void postAndNotifyAdapter(final Handler handler, final RecyclerView recyclerView, final RecyclerView.Adapter adapter) { 
     handler.post(new Runnable() { 
      @Override 
      public void run() { 
       if (!recyclerView.isComputingLayout()) { 
        adapter.notifyDataSetChanged(); 
       } else { 
        postAndNotifyAdapter(handler, recyclerView, adapter); 
       } 
      } 
     }); 
    } 
+0

나는 당신을 완벽하게 이해하지 못한다고 생각합니다. 그것은 이미 내 활동에서 코드가 엉망이되었습니다. –

+0

이것을 시도해 보셨습니까? – Noveen

+0

예 그래도 작동하지 않습니다. –