2016-10-24 1 views
0

私は他の回答を見ようとしましたが、私のケースに対処していません。私は無限のスクロールでrecyviewにアイテムをロードするたびに、私のrecyclerviewでエラーが発生します。時々、それは、リサイクルビューにアイテムをロードし、他の時には、以下のように、logcatにメッセージを与えられたリサイクルビューをブランクのままにします。アプリケーションのRecycleview notifyDataSetChanged()erro

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

私のクラスは私のアダプタが

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のように見えている

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); 
     } 
    }); 

として、なぜ私はまだそのエラー私はこのアプリを実行するたびに得るのですか?

+0

'new RetrieveItems()。execute()'はデータを読み込みますか? –

+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

はい、私はまだ動作していません –

関連する問題