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 中,您正在通知另一个适配器实例
我正在尝试在异步调用完成后使用列表视图更新片段,但出现以下错误:
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 中,您正在通知另一个适配器实例