【问题标题】:Android - PullToRefreshListView shows make sure your adapter calls notifyDatasechangedAndroid - PullToRefreshListView 显示确保您的适配器调用 notifyDatasechanged
【发布时间】:2014-08-12 11:30:29
【问题描述】:

当我多次刷新列表视图时,它显示以下异常。

这里是异常:java.lang.IllegalStateException:适配器的内容已经改变,但ListView没有收到通知。确保适配器的内容不是从后台线程修改的,而只是从 UI 线程修改的。确保您的适配器在其内容更改时调用 notifyDataSetChanged()。 [在 ListView(16908298, class com.handmark.pulltorefresh.library.PullToRefreshListView$InternalListViewSDK9) 和 Adapter(class android.widget.HeaderViewListAdapter)]

代码如下:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        MyLog.i(TAG, "============oncreate===========");
        this.history = new ArrayList();
        group = this;
        Dataengine.whichtab=0;
        View vdw = LayoutInflater.from(getApplicationContext()).inflate(
                R.layout.home_tab, null);
        replaceView(vdw);
        // setContentView(R.layout.home_tab);
        adapter = new SampleAdapter(HOme.this);
        list = (PullToRefreshListView) vdw.findViewById(R.id.listone);
        settings = (ImageView) vdw.findViewById(R.id.settings);
        stampd=(TextView)vdw.findViewById(R.id.stampdtext);
        stampd.setTypeface(Dataengine.isTypeface(this, "condensed"));

        list.setAdapter(adapter);
        parserobject = new DomParserUserlist(HOme.this);
        loginuser = UserData.newInstance();
        new Dobackground("norefresh").execute();
        list.setOnItemClickListener(itemclicklistener);
        settings.setOnClickListener(this);


        options = new DisplayImageOptions.Builder()
        .showImageOnLoading(R.drawable.ic_launcher)
        .showImageForEmptyUri(R.drawable.ic_launcher)
        .showImageOnFail(R.drawable.ic_launcher)
        .cacheInMemory(true)
        .cacheOnDisk(true)
        .considerExifParams(true)
        .displayer(new RoundedBitmapDisplayer(20))
        .build();




        Log.v("srinu", "-------------onCreate----------------");




        list.setMode(Mode.PULL_DOWN_TO_REFRESH);    // mode refresh for top and bottom
        list.setShowIndicator(false); //disable indicator
        list.setPullLabel("Loading");

        // Set a listener to be invoked when the list should be refreshed.
        list.setOnRefreshListener(new OnRefreshListener<ListView>() {
            @Override
            public void onRefresh(PullToRefreshBase<ListView> refreshView) {
                // Do work to refresh the list here.
                //limit=limit+10;
                offset=offset+limit;
                new Dobackground("refresh").execute();
            }
        });
        /*list.setOnLastItemVisibleListener(new OnLastItemVisibleListener() {

            @Override
            public void onLastItemVisible() {
                MyLog.i(TAG, "=============77777&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&==========" );
                //Toast.makeText(MainActivity.this, "End of List!", Toast.LENGTH_SHORT).show();
            }
        });*/
    }

list = (PullToRefreshListView) vdw.findViewById(R.id.listone);
list.setMode(Mode.PULL_DOWN_TO_REFRESH);    // mode refresh for top and bottom
        list.setShowIndicator(false); //disable indicator
        list.setPullLabel("Loading");

        // Set a listener to be invoked when the list should be refreshed.
        list.setOnRefreshListener(new OnRefreshListener<ListView>() {
            @Override
            public void onRefresh(PullToRefreshBase<ListView> refreshView) {
                // Do work to refresh the list here.
                //limit=limit+10;
                offset=offset+limit;
                new Dobackground("refresh").execute();
            }
        });


class Dobackground extends AsyncTask<Void, Void, Void> {
        String pullref;
        public Dobackground(String string) {
            pullref=string;
        }

        // private ProgressDialog pd;
        @Override
        protected void onPreExecute() {
            if(!pullref.equalsIgnoreCase("refresh"))
              showDialog(MYDIALOG);
            //list.setVisibility(View.GONE);
            super.onPreExecute();
        }

        @Override
        protected Void doInBackground(Void... params) {

            SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// dd/MM/yyyy
            Date now = new Date();

            String strDate = sdfDate.format(now);
            MyLog.i(TAG, "============doInBackground=== date========"+strDate);

            if(null!=data)
                data.clear();

            String urls=Dataengine.FriendsAvilableInVenue+"?userid="+ 
            Dataengine.showPreferences(HOme.this,Dataengine.USERID)+"&date="+strDate+"&limit="+limit+"&offset=0";

            urls=urls.replace(" ","%20");

            if(Dataengine.isConnectingToInternet(HOme.this)){
                data = parserobject.getData(urls,"home");
            }else{
                runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        Dataengine.ShowDialog(HOme.this,"No Internet Connection");
                    }
                });

            }


//          MyLog.i(TAG, "============doinbackgrund list size==========="+ data.size());


            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    // TODO Auto-generated method stub

                    try{
                        if(null!=data&&data.size()>0){
                            adapter.notifyDataSetChanged();
                        }else{
                            //Dataengine.ShowDialog(HOme.this,"No Data is Avilable");
                        }

                    }catch(Exception e){
                        e.printStackTrace();
                    }
                    //list.setVisibility(View.VISIBLE);
                    list.requestLayout();
                }
            });

            if(!pullref.equalsIgnoreCase("refresh"))
            removeDialog(MYDIALOG);
            list.onRefreshComplete();
            super.onPostExecute(result);
        }



    }

【问题讨论】:

  • 你确定 notifyDatasetChanged() 被调用了吗?

标签: android pull-to-refresh


【解决方案1】:

试试这个。这是你的 AsyncTask,我稍微调整了一下。

class Dobackground extends AsyncTask<Void, Void, boolean> {
        String pullref;
        public Dobackground(String string) {
            pullref=string;
        }

        // private ProgressDialog pd;
        @Override
        protected void onPreExecute() {
            if(!pullref.equalsIgnoreCase("refresh"))
              showDialog(MYDIALOG);
            //list.setVisibility(View.GONE);
            super.onPreExecute();
        }

        @Override
        protected Void doInBackground(Void... params) {

            SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// dd/MM/yyyy
            Date now = new Date();

            String strDate = sdfDate.format(now);
            MyLog.i(TAG, "============doInBackground=== date========"+strDate);

            if(null!=data)
                data.clear();

            String urls=Dataengine.FriendsAvilableInVenue+"?userid="+ 
            Dataengine.showPreferences(HOme.this,Dataengine.USERID)+"&date="+strDate+"&limit="+limit+"&offset=0";

            urls=urls.replace(" ","%20");

            if(Dataengine.isConnectingToInternet(HOme.this)){
                data = parserobject.getData(urls,"home");
            }else{
                return false;
            }


//          MyLog.i(TAG, "============doinbackgrund list size==========="+ data.size());


            return true;
        }

        @Override
        protected void onPostExecute(Void result) {

            if(result){
                if(null!=data&&data.size()>0){
                            adapter.notifyDataSetChanged();
                        }else{
                            //Dataengine.ShowDialog(HOme.this,"No Data is Avilable");
                        }
            }else{
             Dataengine.ShowDialog(HOme.this,"No Internet Connection");
            }
            list.requestLayout();

            if(!pullref.equalsIgnoreCase("refresh"))
            removeDialog(MYDIALOG);
            list.onRefreshComplete();
            super.onPostExecute(result);
        }



    }

【讨论】:

  • 此代码也有同样的问题。但不称为 notifyDatasetchanged。唯一的例外即将到来。第一次刷新工作并调用 notifydatasetchanged。我的意思是我去了第二个屏幕然后来到 PulltoRefresh 屏幕,因此只有例外来
  • 因此,如果您将列表拉出 3-4 次,则不会引发异常。但是当你去另一个活动并回来拉列表时,抛出异常?
  • 是的,你是对的。但没有拉也有时会出现异常
  • 粘贴您的 onCreate 问题
猜你喜欢
  • 2020-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多