java.lang.IllegalStateException:适配器的内容发生了变化 [英] java.lang.IllegalStateException: The content of the adapter has changed

查看:999
本文介绍了java.lang.IllegalStateException:适配器的内容发生了变化的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  java.lang.IllegalStateException:适配器的内容发生了变化,但ExtendableListView没有收到通知。确保您的适配器的内容是不是从后台线程修改,但只能从UI线程。
 

我偶尔会收到上面的异常,而点击加载更多动态列表视图里面的选项。 我使用 notifyDataSetChanged() postExecute()。有什么可以解决这个问题以及如何阻止应用程序从这个崩溃?

 适配器=新GHomeGridAdapter(getActivity()getApplicationContext(),R.layout.g_grid,ggridList。);

gridview.setAdapter(适配器);
新的GetData()执行(限制);

loadMore.setOnClickListener(新View.OnClickListener(){

    @覆盖
    公共无效的onClick(视图v){
        loadMore.setVisibility(View.GONE);
        新的GetData()执行(限制);
    }
});

gridview.setOnScrollListener(新AbsListView.OnScrollListener(){

    @覆盖
    公共无效onScrollStateChanged(AbsListView观点,诠释scrollState){

        如果(gridview.getLastVisiblePosition()+ 1 ==限制){
            loadMore.setVisibility(View.VISIBLE);
        }
    }

私有类的GetData扩展的AsyncTask<整数,虚空,虚空> {

    @覆盖
    在preExecute保护无效(){
        super.on preExecute();
        pDialog =新ProgressDialog(myContext);
        pDialog.setMessage(请稍候...);
        pDialog.setCancelable(假);
        pDialog.show();
    }

    @覆盖
    保护无效doInBackground(整数...为arg0){
        GyHandler SH =新GyHandler();
        INT offest =为arg0 [0];
        极限=为arg0 [0] +30;
        字符串urlgifs =XYZ;
        字符串jsonStr = sh.makeServiceCall(urlgifs,GHandler.GET);

        如果(jsonStr!= NULL){
            尝试 {
                JSONObject的jsonObj =新的JSONObject(jsonStr);
            }赶上(JSONException E){
                e.printStackTrace();
            }
        } 其他 {
        }
        返回null;
    }

    @覆盖
    保护无效onPostExecute(无效的结果){
        super.onPostExecute(结果);

        如果(pDialog.isShowing())
            pDialog.dismiss();

        adapter.notifyDataSetChanged();
    }

}
 

日志 -

  java.lang.IllegalStateException:适配器的内容发生了变化,但ExtendableListView没有收到通知。确保您的适配器的内容是不是从后台线程修改,但只能从UI线程。 [在ExtendableListView(2131427542,类com.etsy.android.grid.StaggeredGridView)与适配器(类xyz.GiphyHomeGridAdapter)
            在com.etsy.android.grid.ExtendableListView.layoutChildren(ExtendableListView.java:559)
            在com.etsy.android.grid.StaggeredGridView.layoutChildren(StaggeredGridView.java:358)
            在com.etsy.android.grid.ExtendableListView.onLayout(ExtendableListView.java:513)
            在android.view.View.layout(View.java:14937)
            在android.view.ViewGroup.layout(ViewGroup.java:4651)
            在android.widget.RelativeLayout.onLayout(RelativeLayout.java:1055)
            在android.view.View.layout(View.java:14937)
            在android.view.ViewGroup.layout(ViewGroup.java:4651)
            在android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
            在android.widget.FrameLayout.onLayout(FrameLayout.java:388)
            在android.view.View.layout(View.java:14937)
            在android.view.ViewGroup.layout(ViewGroup.java:4651)
            在android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.java:887)
            在android.view.View.layout(View.java:14937)
            在android.view.ViewGroup.layout(ViewGroup.java:4651)
            在android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
            在android.widget.FrameLayout.onLayout(FrameLayout.java:388)
            在android.view.View.layout(View.java:14937)
            在android.view.ViewGroup.layout(ViewGroup.java:4651)
            在android.support.v7.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:502)
            在android.view.View.layout(View.java:14937)
            在android.view.ViewGroup.layout(ViewGroup.java:4651)
            在android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
            在android.widget.FrameLayout.onLayout(FrameLayout.java:388)
            在android.view.View.layout(View.java:14937)
            在android.view.ViewGroup.layout(ViewGroup.java:4651)
            在android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)
            在android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)
            在android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
            在android.view.View.layout(View.java:14937)
            在android.view.ViewGroup.layout(ViewGroup.java:4651)
            在android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
            在android.widget.FrameLayout.onLayout(FrameLayout.java:388)
            在android.view.View.layout(View.java:14937)
            在android.view.ViewGroup.layout(ViewGroup.java:4651)
            在android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2132)
            在android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1872)
            在android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1075)
            在android.view.ViewRootImpl $ TraversalRunnable.run(ViewRootImpl.java:5878)
            在android.view.Choreographer $ CallbackRecord.run(Choreographer.java:761)
            在android.view.Choreographer.doCallbacks(Choreographer.java:574)
            在android.view.Choreographer.doFrame(Choreographer.java:544)
            在android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:747)
            在android.os.Handler.handleCallback(Handler.java:733)
            在android.os.Handler.dispatchMessage(Handler.java:95)
            在android.os.Looper.loop(Looper.java:136)
            在android.app.ActivityThread.main(ActivityThread.java:5086)
            在java.lang.reflect.Method.invokeNative(本机方法)
 

解决方案

试试这个,以确保通知发生在主线程。

  @覆盖
        在preExecute保护无效(){
         super.on preExecute();
         runOnUiThread(新的Runnable(){
               @覆盖
               公共无效的run(){
                 pDialog =新ProgressDialog(myContext);
                 pDialog.setMessage(请稍候...);
                 pDialog.setCancelable(假);
                 pDialog.show();
               }
             });
         }

        @覆盖
        保护无效onPostExecute(虚空结果)
        {
         super.onPostExecute(结果);
         如果(pDialog.isShowing())
             runOnUiThread(新的Runnable(){

               @覆盖
               公共无效的run(){
                pDialog.dismiss();
                adapter.notifyDataSetChanged();
               }
             });

        }
 

 java.lang.IllegalStateException: The content of the adapter has changed but ExtendableListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread.

I am occasionally getting above exception while clicking on "load more" option inside dynamic listview. I am using notifyDataSetChanged() inside postExecute(). What can be the solution to this and how to stop app crashing from this ?

adapter = new GHomeGridAdapter(getActivity().getApplicationContext(), R.layout.g_grid, ggridList);

gridview.setAdapter(adapter);
new GetData().execute(limit); 

loadMore.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        loadMore.setVisibility(View.GONE);
        new GetData().execute(limit);
    }
});

gridview.setOnScrollListener(new AbsListView.OnScrollListener() {

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {

        if (gridview.getLastVisiblePosition() + 1 == limit) {
            loadMore.setVisibility(View.VISIBLE);
        }
    }

private class GetData extends AsyncTask<Integer, Void, Void> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(myContext);
        pDialog.setMessage("Please wait...");
        pDialog.setCancelable(false);
        pDialog.show();
    }

    @Override
    protected Void doInBackground(Integer... arg0) {
        GyHandler sh = new GyHandler();
        int offest=arg0[0];
        limit=arg0[0]+30;
        String urlgifs="xyz";
        String jsonStr = sh.makeServiceCall(urlgifs, GHandler.GET);

        if (jsonStr != null) {
            try {
                JSONObject jsonObj = new JSONObject(jsonStr);
            } catch (JSONException e) {
                e.printStackTrace();
            }
        } else {
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);

        if (pDialog.isShowing())
            pDialog.dismiss();

        adapter.notifyDataSetChanged();
    }

}

Log-

 java.lang.IllegalStateException: The content of the adapter has changed but ExtendableListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. [in ExtendableListView(2131427542, class com.etsy.android.grid.StaggeredGridView) with Adapter(class xyz.GiphyHomeGridAdapter)]
            at com.etsy.android.grid.ExtendableListView.layoutChildren(ExtendableListView.java:559)
            at com.etsy.android.grid.StaggeredGridView.layoutChildren(StaggeredGridView.java:358)
            at com.etsy.android.grid.ExtendableListView.onLayout(ExtendableListView.java:513)
            at android.view.View.layout(View.java:14937)
            at android.view.ViewGroup.layout(ViewGroup.java:4651)
            at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1055)
            at android.view.View.layout(View.java:14937)
            at android.view.ViewGroup.layout(ViewGroup.java:4651)
            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
            at android.view.View.layout(View.java:14937)
            at android.view.ViewGroup.layout(ViewGroup.java:4651)
            at android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.java:887)
            at android.view.View.layout(View.java:14937)
            at android.view.ViewGroup.layout(ViewGroup.java:4651)
            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
            at android.view.View.layout(View.java:14937)
            at android.view.ViewGroup.layout(ViewGroup.java:4651)
            at android.support.v7.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:502)
            at android.view.View.layout(View.java:14937)
            at android.view.ViewGroup.layout(ViewGroup.java:4651)
            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
            at android.view.View.layout(View.java:14937)
            at android.view.ViewGroup.layout(ViewGroup.java:4651)
            at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)
            at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)
            at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
            at android.view.View.layout(View.java:14937)
            at android.view.ViewGroup.layout(ViewGroup.java:4651)
            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
            at android.view.View.layout(View.java:14937)
            at android.view.ViewGroup.layout(ViewGroup.java:4651)
            at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2132)
            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1872)
            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1075)
            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5878)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
            at android.view.Choreographer.doCallbacks(Choreographer.java:574)
            at android.view.Choreographer.doFrame(Choreographer.java:544)
            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5086)
            at java.lang.reflect.Method.invokeNative(Native Method)

解决方案

Try this to make sure that notify happens in the main thread.

       @Override
        protected void onPreExecute() {
         super.onPreExecute();
         runOnUiThread(new Runnable() {
               @Override
               public void run() {
                 pDialog = new ProgressDialog(myContext);
                 pDialog.setMessage("Please wait...");
                 pDialog.setCancelable(false);
                 pDialog.show();
               }
             });
         }

        @Override
        protected void onPostExecute(Void result)
        {
         super.onPostExecute(result);
         if (pDialog.isShowing())
             runOnUiThread(new Runnable() {

               @Override
               public void run() {
                pDialog.dismiss();
                adapter.notifyDataSetChanged();
               }
             });

        }

这篇关于java.lang.IllegalStateException:适配器的内容发生了变化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆