java.lang.IllegalStateException: 适配器的内容已更改但 ListView 未收到通知 - List with Universal Image Loader

java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification - List with Universal Image Loader

我正在尝试在异步调用完成后使用列表视图更新片段,但出现以下错误:

java.lang.IllegalStateException: adapter 的内容已经改变但是ListView 没有收到通知。

我正在更新适配器 onPostExecute 并且还检查了主线程上的函数 运行 但我仍然收到 IllegalStateException。

@Override
    protected void onPostExecute(List<String> result) {
        if (null != mClient)
            mClient.close();
        //TODO
            //Constants.IMAGES = result.toArray(new String[result.size()]);
        Constants.IMAGES.addAll(result);
            Log.i("IMAGES", IMAGES.toString());
            if (mTheListener != null && firstCallFlag ) {
                firstCallFlag = false;
                mTheListener.GotoNextScreen();
            }else{
                dataUpdateListener.dataUpdated(result);
            }
    }

@Override
    protected List<String> doInBackground(Void... params) {

        if(afterTag != null){
            URL += "?after="+afterTag;
            System.out.println("::New URL:: "+ URL);
        }
        HttpGet request = new HttpGet(URL);
        JSONResponseHandler responseHandler = new JSONResponseHandler();
        try {
            return mClient.execute(request, responseHandler);
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }


@Override
public void dataUpdated(List<String> data) {
    // TODO Auto-generated method stub
    System.out.println("::Notify data update listener called");
    System.out.println("Looper "+Looper.myLooper());
    System.out.println("Main Looper "+Looper.getMainLooper());
    imageUrls.addAll(data);
    mAdapter.notifyDataSetChanged();
}

//fragment onCreateView - Adapter 设置在这里

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fr_image_list, container,
            false);
    listView = (ListView) rootView.findViewById(android.R.id.list);

    // Adding the load more

    // LoadMore button
    Button btnLoadMore = new Button(getActivity().getApplicationContext());
    btnLoadMore.setText("Load More");

    // Adding Load More button to lisview at bottom
    listView.addFooterView(btnLoadMore);

    /**
     * Listening to Load More button click event
     * */
    btnLoadMore.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // Starting a new async task
            Constants.getUrlFromRedditService();
        }
    });
    mAdapter = new ImageAdapter();
    ((ListView) listView).setAdapter(new ImageAdapter());

    listView.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            startImagePagerActivity(position);
        }
    });
    return rootView;
}

P.S:我正在使用 Universal Image Loader 来填充列表中的图像。

我猜你的适配器中的 getView() 函数有问题,当实例化一个 convertView 时,你应该提供参数内容,你最好使用你的 ActivityName.this 而不是 getApplicationContext();

尝试替换下面的代码行

 ((ListView) listView).setAdapter(new ImageAdapter());

 ((ListView) listView).setAdapter(mAdapter);

请注意,对于 listView,您总是设置一个新的适配器,并且在您的 onPostExecute 中,您正在通知另一个适配器实例