android - Cannot call this method while RecyclerView is computing a layout or scrolling when try remove item from recyclerview

android - Cannot call this method while RecyclerView is computing a layout or scrolling when try remove item from recyclerview

Ethan Savitr Author: Ethan Savitr Date: 2022-08-16
android - Cannot call this method while RecyclerView is computing a layout or scrolling when try remove item from recyclerview

All you need to know about android - Cannot call this method while RecyclerView is computing a layout or scrolling when try remove item from recyclerview , in addintion to android - IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling , android - No virtual method findViewHolderForPosition(I) when trying to click on RecyclerView item with Espresso , android - Recyclerview onBindViewHolder called for all items when inside LinearLayout with weights , android - Cannot call notifyItemInserted() from RecyclerView.OnScrollListener

  1. android - Cannot call this method while RecyclerView is computing a layout or scrolling when try remove item from recyclerview
  2. Question:

    I am Trying to remove my item from recyclerview, but i always getting error

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

    i am using notify datasetchanged, can i solve this?

    public class AdapterIntransit extends RecyclerView.Adapter<AdapterIntransit.ViewHolder> {
        private Context context;
        List<DataIntransit> data;
    
        public AdapterIntransit(Context context, List<DataIntransit> data) {
            this.context = context;
            this.data = data;
        }
    
        @Override
        public AdapterIntransit.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.cardintransit, parent, false);
            return new ViewHolder(itemView);
        }
    
        @Override
        public void onBindViewHolder(AdapterIntransit.ViewHolder holder, int position) {
            if (data.get(position).getJml1() - data.get(position).getJml2() <= 0) {
                data.remove(position);
                notifyItemRemoved(position);
                notifyItemRangeChanged(position, getItemCount());
                notifyDataSetChanged();
            } else {
                holder.kode.setText(data.get(position).getKode());
                holder.nama.setText(data.get(position).getNama());
                holder.jumlah.setText(String.valueOf(data.get(position).getJml1() - data.get(position).getJml2()));
            }
        }
    
        @Override
        public int getItemCount() {
            return data.size();
        }
        public class ViewHolder extends RecyclerView.ViewHolder{
            TextView kode, nama, jumlah;
            public ViewHolder(View itemView) {
                super(itemView);
                kode = (TextView)itemView.findViewById(R.id.kode);
                nama = (TextView)itemView.findViewById(R.id.nama);
                jumlah = (TextView)itemView.findViewById(R.id.jumlah);
    
            }
        }
    }
    


    Solution 1:

    Below answer worked for me

    This is just workaround for the problem.

    This usually occurs when you are calling notifyDataSetChanged() on the background thread. So just move notify to UI thread

    recyclerView.post(new Runnable()
                {
                  @Override
                  public void run() {
                    myadapter.notifyDataSetChanged();
                  }
                });
    

    You use your RecyclerView instance and inside the post method a new Runnable added to the message queue. The runnable will be run on the user interface thread. This is a limit for Android to access the UI thread from background (e.g. inside a method which will be run in a background thread). for more you run it on UI thread if you needed.

    For more you can run it on UI thread, if you needed

     runOnUiThread(new Runnable(){
     public void run() {
          // UI code goes here
     }
     });
    

    Solution 2:

    This is useful when select All checkbox on click of top checkbox in recyclerview.

    recyclerview.post(new Runnable()
    {
         @Override
         public void run() {
             myadapter.notifyDataSetChanged();
         }
    });
    

    Solution 3:

    If you are tyring to notify recylew item then use isComputingLayout method:

    if (!mRecyclerView.isComputingLayout()) 
    {
     // add your code here
    }
    

  3. android - IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling
  4. Question:

    I am trying to remove an item from my RecyclerView, but I always get an error.

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

    I am using notifyDataSetChanged(). How can I solve this?

    Here is my adapter code

    public class ListAdapters extends RecyclerView.Adapter<ListAdapters.MyViewHolder> {
    
        public ArrayList<String> tvdatalist;
        Context c;
        int pos;
        ListAdapters.MyViewHolder myViewHolder;
        private LayoutInflater layoutInflater;
        int[] arr;
    
        public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    
    
            public EditText edttxt;
            public CheckBox cb;
    
            public MyViewHolder(View view) {
                super(view);
    
                edttxt = (EditText) view.findViewById(R.id.edttxt);
                cb = (CheckBox) view.findViewById(R.id.cb);
            }
    
            @Override
            public void onClick(View v) {
    
            }
    
    
        }
    
        public ListAdapters(Context c, ArrayList<String> tvdatalist) {
            this.c = c;
            this.layoutInflater = LayoutInflater.from(c);
            this.tvdatalist = tvdatalist;
            arr = new int[tvdatalist.size()];
            for (int i = 0; i < 20; i++) {
                arr[i] = 0;
    
            }
    
    
        }
    
        @Override
        public ListAdapters.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            return new ListAdapters.MyViewHolder(this.layoutInflater.inflate(R.layout.list_ittm, parent, false));
            //return new LandingPageAdapter.MyViewHolder(itemView);
        }
    
        public void onBindViewHolder(final ListAdapters.MyViewHolder holder, final int position) {
            myViewHolder = holder;
    
            final String ShowsBean = tvdatalist.get(position);
            myViewHolder.edttxt.setText(ShowsBean);
            if (arr[pos] == 0) {
                myViewHolder.cb.setChecked(false);
                myViewHolder.edttxt.setKeyListener(null);
            } else {
                myViewHolder.cb.setChecked(true);
                myViewHolder.edttxt.setFocusable(true);
            }
    
    
    
            myViewHolder.cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
    
                        if (arr[position]==0){
                            arr[position]=1;
                        }else{
                            arr[position]=0;
    
                        }
                     notifyDataSetChanged();
    
                }
    
            });
    
        }
        @Override
        public int getItemCount() {
            return tvdatalist.size();
    
        }
    
        public interface ItemClickListener {
            void onClick(View view, int position, boolean isLongClick);
        }
    }
    


    Solution 1:

    As Abbas said

    This usually occurs when you are calling notify on bg thread. So just move notify to ui thread

    else you can use notifyItemChanged(position);

    this will also worked as well.

    Solution 2:

    You can also use runnable to make changes on UI thread.

    recyclerView.post(new Runnable() {
        @Override
        public void run() {
            notifyDataSetChanged();
        }
    });
    

    This will notify adapter changes on UI thread.

    Solution 3:

    This problem shows when you are trying to update the recyclerview when it still inflating the item, try to move the notifyItemChanged(position), to where you are sure the item has been added to your view before calling the- method(notifyItemChanged(position));

  5. android - No virtual method findViewHolderForPosition(I) when trying to click on RecyclerView item with Espresso
  6. Question:

    I'm trying to make a simple espresso test that will find the first item in RecyclerView without specific label and click on it. To achieve this I added espresso-contrib to project like this:

    androidTestCompile('com.android.support.test.espresso:espresso-contrib:2.2.2') {
        // Necessary to avoid version conflicts
        exclude group: 'com.android.support', module: 'appcompat'
        exclude group: 'com.android.support', module: 'design'
        exclude group: 'com.android.support', module: 'support-v4'
        exclude group: 'com.android.support', module: 'appcompat-v7'
        exclude group: 'com.android.support', module: 'support-annotations'
        exclude module: 'recyclerview-v7'
    }
    

    and wrote the following expression in my test case: onView(withId(R.id.sresults_list_recycler)).perform(RecyclerViewActions.actionOnHolderItem(new FirstNotSoldOutMatcher(), click()).atPosition(1));

    Matcher works perfectly and RecyclerView got scrolled to the target item. But then I get error:

    java.lang.NoSuchMethodError: No virtual method findViewHolderForPosition(I)Landroid/support/v7/widget/RecyclerView$ViewHolder; in class Landroid/support/v7/widget/RecyclerView; or its super classes (declaration of 'android.support.v7.widget.RecyclerView' appears in /data/app/com.example-1/base.apk)
    at android.support.test.espresso.contrib.RecyclerViewActions$ActionOnItemAtPositionViewAction.perform(RecyclerViewActions.java:288)
    at android.support.test.espresso.contrib.RecyclerViewActions$ActionOnItemViewAction.perform(RecyclerViewActions.java:232)
    at android.support.test.espresso.ViewInteraction$1.run(ViewInteraction.java:144)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:428)
    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
    at android.os.Handler.handleCallback(Handler.java:751)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6077)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
    

    This looks strange to me. I read in Google documentation that findViewHolderForPosition method is deprecated now but it should still be there. I also have multidex enabled in the app but according to docs it is supported out of the box so shouldn't be a problem too.

    Do you have any idea what can be wrong with this test?


    Solution 1:

    Ok, in my case problem was in ProGuard shrinking unused methods. Disabling it for tests helped.

    For future seekers - if you don't want to disable proguard for debug build adding this line to proguard config should help too:

    -keepclasseswithmembers public class android.support.v7.widget.RecyclerView { *; }
    

    Also, note that this rule should be added to the regular proguard file(the one of listed in proguardFiles) and not the test one(declared as testProguardFile)

    Solution 2:

    You can also use runnable to make changes on UI thread.

    recyclerView.post(new Runnable() {
        @Override
        public void run() {
            notifyDataSetChanged();
        }
    });
    

    This will notify adapter changes on UI thread.

  7. android - Recyclerview onBindViewHolder called for all items when inside LinearLayout with weights
  8. Question:

    I recently updated from support library recyclerview-v7:23.1.1 to recyclerview-v7:25.1.0.

    My Layout contains 2 recylerviews splitted 50% on the screen. The xml code is as follows:

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">
    
        <android.support.v7.widget.RecyclerView
            android:id="@+id/recyclerView1"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:scrollbars="none"/>
    
        <android.support.v4.widget.Space
            android:layout_width="@dimen/two_dp"
            android:layout_height="match_parent"
            android:background="@color/dark_gray"/>
    
        <android.support.v7.widget.RecyclerView
            android:id="@+id/recyclerView2"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:scrollbars="none"/>
    
    </LinearLayout>
    

    Now onBindViewHolder is called for all list items instead of only the visible items. This started happening after update to support library 25.1.0.

    It is working fine if weights are removed, but having 2 recylcerviews side by side is required.

    How do I tell recyclerview to recycle views instead of loading all?

    UPDATE: It works fine on Marshmallow and above devices. The issue is present in Lollipop or below. You can find a demo project here: https://bitbucket.org/aniketit/recyclerviewtest


    Solution 1:

    I ran into the same issue which persisted after removing weighted and 0dp elements. In my case, the issue was rather trivial - I had inadvertently put my RecyclerView inside of a NestedScrollView with fillViewPort=true. This causes the Adapter will build all the elements for the view and you will notice a significant delay in responsiveness.

    Turns out the issue will occur if you just have the RecyclerView in a plain old ScrollView too.

    Solution 2:

    I had the same issue. RecyclerView was recycling well in Marshmallow but not before.

    My mistake was to put my RecyclerView into a ScrollView. You should check if you have a scrollview, if yes, remove it and your issue will be solved for pre marshmallow devices.

    Solution 3:

    With libraries > than 23.1.1 you can remove

    android:layout_width="0dp"

    remove it and all works perfectly.

  9. android - Cannot call notifyItemInserted() from RecyclerView.OnScrollListener
  10. Question:

    Recently I upgrade my recyclerview-v7:23 to recyclerview-v7:24.2.0. My applicaton has an endless scroll list. The error message points to the line notifyItemInserted when I add loading view into RecyclerView (null object it means loading, id 0 is empty, -1 is end of the page) and it works fine before (recyclerview-v7:23) but suddenly I got error like this and somehow my loading show up twice then when it removed one, there is one loading that still visible in the top.

        W/RecyclerView: Cannot call this method in a scroll callback. Scroll callbacks might be run during a measure & layout pass where you cannot change the RecyclerView data. Any method call that might change the structure of the RecyclerView or the adapter contents should be postponed to the next frame.java.lang.IllegalStateException:  
     at android.support.v7.widget.RecyclerView.assertNotInLayoutOrScroll(RecyclerView.java:2403)
         at android.support.v7.widget.RecyclerView$RecyclerViewDataObserver.onItemRangeInserted(RecyclerView.java:4631)
         at android.support.v7.widget.RecyclerView$AdapterDataObservable.notifyItemRangeInserted(RecyclerView.java:10469)
         at android.support.v7.widget.RecyclerView$Adapter.notifyItemInserted(RecyclerView.java:6211)
         at com.sketchproject.infogue.fragments.MessageFragment.loadMessages(MessageFragment.java:109)
         at com.sketchproject.infogue.fragments.MessageFragment.access$100(MessageFragment.java:42)
         at com.sketchproject.infogue.fragments.MessageFragment$1.onLoadMore(MessageFragment.java:87)
         at com.sketchproject.infogue.modules.EndlessRecyclerViewScrollListener.onScrolled(EndlessRecyclerViewScrollListener.java:74)
    

    When I remove the part of error (add loading) it works fine again, I don't know why, is the newer version of recyclerview prevent adding data into adapter too fast or there is callback function that triggered when "measure & layout" of recyclerview finished, this is my code

    private void loadArticles(final int page) {
            if (!isEndOfPage && apiArticleUrl != null) {
                if (swipeRefreshLayout == null || !swipeRefreshLayout.isRefreshing()) {
                    allArticles.add(null);
                    articleAdapter.notifyItemInserted(allArticles.size() - 1); // error here
                }
    
                JsonObjectRequest articleRequest = new JsonObjectRequest(Request.Method.GET, apiArticleUrl, null,
                        new Response.Listener<JSONObject>() {
                            @Override
                            public void onResponse(JSONObject response) {
    
                                try {
                                    String status = response.getString("status");
                                    JSONObject articles = response.getJSONObject("articles");
    
                                    String nextUrl = articles.getString("next_page_url");
                                    int currentPage = articles.getInt("current_page");
                                    int lastPage = articles.getInt("last_page");
                                    JSONArray data = articles.optJSONArray("data");
    
                                    apiArticleUrl = nextUrl;
    
                                    if (status.equals(APIBuilder.REQUEST_SUCCESS)) {
                                        if (swipeRefreshLayout == null || !swipeRefreshLayout.isRefreshing()) {
                                            allArticles.remove(allArticles.size() - 1);
                                            articleAdapter.notifyItemRemoved(allArticles.size());
                                        } else {
                                            swipeRefreshLayout.setRefreshing(false);
                                            int total = allArticles.size();
                                            for (int i = 0; i < total; i++) {
                                                allArticles.remove(0);
                                            }
                                            articleAdapter.notifyItemRangeRemoved(0, total);
                                        }
    
                                        List<Article> moreArticles = new ArrayList<>();
    
                                        if (data != null) {
                                            for (int i = 0; i < data.length(); i++) {
                                                JSONObject articleData = data.getJSONObject(i);
                                                Article article = new Article();
                                                article.setId(articleData.getInt(Article.ID));
                                                article.setSlug(articleData.getString(Article.SLUG));
                                                article.setTitle(articleData.getString(Article.TITLE));
                                                article.setFeatured(articleData.getString(Article.FEATURED_REF));
                                                article.setCategoryId(articleData.getInt(Article.CATEGORY_ID));
                                                article.setCategory(articleData.getString(Article.CATEGORY));
                                                article.setSubcategoryId(articleData.getInt(Article.SUBCATEGORY_ID));
                                                article.setSubcategory(articleData.getString(Article.SUBCATEGORY));
                                                article.setContent(articleData.getString(Article.CONTENT));
                                                article.setContentUpdate(articleData.getString(Article.CONTENT_UPDATE));
                                                article.setPublishedAt(articleData.getString(Article.PUBLISHED_AT));
                                                article.setView(articleData.getInt(Article.VIEW));
                                                article.setRating(articleData.getInt(Article.RATING_TOTAL));
                                                article.setStatus(articleData.getString(Article.STATUS));
                                                moreArticles.add(article);
                                            }
                                        }
    
                                        int curSize = articleAdapter.getItemCount();
                                        allArticles.addAll(moreArticles);
    
                                        if (allArticles.size() <= 0) {
                                            Log.i("INFOGUE/Article", "Empty on page " + page);
                                            isEndOfPage = true;
                                            Article emptyArticle = new Article(0, null, "Empty page");
                                            allArticles.add(emptyArticle);
                                        } else if (currentPage >= lastPage) {
                                            Log.i("INFOGUE/Article", "End on page " + page);
                                            isEndOfPage = true;
                                            Article endArticle = new Article(-1, null, "End of page");
                                            allArticles.add(endArticle);
                                        }
    
                                        articleAdapter.notifyItemRangeInserted(curSize, allArticles.size() - 1);
                                    } else {
                                        Log.i("INFOGUE/Article", "Error on page " + page);
                                        Helper.toastColor(getContext(), R.string.error_unknown, R.color.color_warning_transparent);
    
                                        isEndOfPage = true;
                                        Article failureArticle = new Article();
                                        failureArticle.setId(-2);
                                        failureArticle.setTitle(getString(R.string.error_unknown));
                                        allArticles.add(failureArticle);
                                    }
                                } catch (JSONException e) {
                                    e.printStackTrace();
                                }
                            }
                        },
                        new Response.ErrorListener() {
                            @Override
                            public void onErrorResponse(VolleyError error) {
                                error.printStackTrace();
    
                                if (swipeRefreshLayout != null && swipeRefreshLayout.isRefreshing()) {
                                    swipeRefreshLayout.setRefreshing(false);
                                }
    
                                // remove last loading
                                allArticles.remove(allArticles.size() - 1);
                                articleAdapter.notifyItemRemoved(allArticles.size());
    
                                String errorMessage = getString(R.string.error_unknown);
                                NetworkResponse networkResponse = error.networkResponse;
                                if (networkResponse == null) {
                                    if (error.getClass().equals(TimeoutError.class)) {
                                        errorMessage = getString(R.string.error_timeout);
                                    } else if (error.getClass().equals(NoConnectionError.class)) {
                                        errorMessage = getString(R.string.error_no_connection);
                                    }
                                } else {
                                    if (networkResponse.statusCode == 404) {
                                        errorMessage = getString(R.string.error_not_found);
                                    } else if (networkResponse.statusCode == 500) {
                                        errorMessage = getString(R.string.error_server);
                                    } else if (networkResponse.statusCode == 503) {
                                        errorMessage = getString(R.string.error_maintenance);
                                    }
                                }
                                Helper.toastColor(getContext(), errorMessage, R.color.color_danger_transparent);
    
                                // add error view holder
                                isEndOfPage = true;
                                Article errorArticle = new Article();
                                errorArticle.setId(-2);
                                errorArticle.setTitle(errorMessage);
                                allArticles.add(errorArticle);
                            }
                        }
                );
    
                articleRequest.setTag("articles");
                articleRequest.setRetryPolicy(new DefaultRetryPolicy(
                        APIBuilder.TIMEOUT_SHORT,
                        DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                        DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
                VolleySingleton.getInstance(getContext()).addToRequestQueue(articleRequest);
            }
        }
    

    that code was called from onCreate method

        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
                View view = inflater.inflate(R.layout.fragment_article_list, container, false);
    
                // Set the adapter
                if (view instanceof RecyclerView) {
                    Context context = view.getContext();
                    recyclerView = (RecyclerView) view;
    
                    // determine column of list
                    LinearLayoutManager linearLayoutManager;
                    if (mColumnCount <= 1) {
                        linearLayoutManager = new LinearLayoutManager(context);
                    } else {
                        linearLayoutManager = new GridLayoutManager(context, mColumnCount);
                }
    
            // if article list authored by logged user then prefer editable view holder
            if (mMyArticle) {
                articleAdapter = new ArticleRecyclerViewAdapter(allArticles, mArticleListListener, mArticleEditableListener);
            } else {
                articleAdapter = new ArticleRecyclerViewAdapter(allArticles, mArticleListListener, hasHeader);
            }
    
            // set the adapter and attach custom scroll listener that triggered onLoadMore() and onReachTop()
            recyclerView.setAdapter(articleAdapter);
            recyclerView.setLayoutManager(linearLayoutManager);
            recyclerView.addOnScrollListener(new EndlessRecyclerViewScrollListener(linearLayoutManager) {
                @Override
                public void onLoadMore(final int page, int totalItemsCount) {
                    if (!isFirstCall) {
                        loadArticles(page);
                    }
                }
    
                @Override
                public void onReachTop(boolean isFirst) {
                    // activate swipe function when list reach top only, find out where do fragment attached
                    if (getActivity() instanceof ArticleActivity) {
                        ((ArticleActivity) getActivity()).setSwipeEnable(isFirst);
                    } else if (getActivity() instanceof ApplicationActivity) {
                        ((ApplicationActivity) getActivity()).setSwipeEnable(isFirst);
                    }
                }
            });
    
            if (isFirstCall) {
                isFirstCall = false;
                loadArticles(0);
            }
        }
        return view;
    } 
    

    My questions are:

    1. Does the issue come from new version of RecyclerView?
    2. Is it wrong to implement notifyItemInserted inside scroll listener? It worked before.
    3. How can I solve this problem?

    Updated

    when I logged the code inside first call and scroll,
    09-12 03:49:10.078 7046-7046/com.sketchproject.infogue I/Infogue/Contributor: Followers URL http://192.168.43.141:8000/api/contributor/support/followers?contributor_id=1
    09-12 03:49:26.421 7046-7046/com.sketchproject.infogue I/Infogue/Contributor: Followers first call
    09-12 03:49:26.421 7046-7046/com.sketchproject.infogue I/Infogue/Contributor: Followers URL http://192.168.43.141:8000/api/contributor/support/followers?contributor_id=1
    09-12 03:49:26.617 7046-7046/com.sketchproject.infogue I/Infogue/Contributor: Followers second call (scroll)
    09-12 03:49:26.618 7046-7046/com.sketchproject.infogue I/Infogue/Contributor: Followers URL http://192.168.43.141:8000/api/contributor/support/followers?contributor_id=1
    09-12 03:49:27.365 7046-7046/com.sketchproject.infogue I/Infogue/Contributor: Followers second call (scroll)
    

    They are called twice when first load, after first call and add loading view somehow the scroll is triggered and call again.


    Solution 1:

    You could also post using the view.

       recyclerView.post(new Runnable() {
            public void run() {
                articleAdapter.notifyItemInserted(allArticles.size() - 1);
            }
        });
    

    Solution 2:

    1. The issue is not with new version of Recyclerview.

    2 & 3. You cannot change item while it is setting (with calling onBindViewHolder). In that case you have to call notifyItemInserted at the end of current loop by calling Handler.post()

    Handler handler = new Handler();
    
        final Runnable r = new Runnable() {
            public void run() {
                articleAdapter.notifyItemInserted(allArticles.size() - 1);
            }
        };
    
        handler.post(r);
    

    I hope, it will solve your problem.

    Solution 3:

    You could also use Google Play Service's Tasks API

    Tasks.call(new Callable<Void>() {
        @Override
        public Void call() throws Exception {
            allArticles.add(null);
            articleAdapter.notifyItemInserted(allArticles.size() - 1);
            return null;
        }
    });