ListView で次のエラーが発生します。
java.lang.IllegalStateException: The content of the adapter has changed but ListView 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. Make sure your adapter calls notifyDataSetChanged() when its content changes
.
私のアプリには、CustomAdapter を持つ ListView があります。
OnCreate メソッドには次のものがあります。
list = new ArrayList<FriendVO>();
mListView = (ListView) this.findViewById(R.id.listView1);
mFriendAdapter = new FriendAdapter(null);
mListView.setAdapter(mFriendAdapter);
また、Web サービスからデータを取得して ListView を埋める AsyncHttpResponseHandler もあります。すべてがうまく機能します。AsyncHttpResponseHandler の onFinish() メソッドで、リスト ビューのデータを更新しています。
メソッド onFinish() にたどり着いたとき、私はすでにデータのリストを持っています。
@Override
public void onFinish(){
mFriendAdapter.setData(list);
mListView.setOnItemClickListener(itemClickListener);
}
これが私のカスタムアダプターです:
private class FriendAdapter extends BaseAdapter {
private List<FriendVO> mData;
private LayoutInflater mInflater;
public FriendAdapter(List<FriendVO> data) {
mData = data;
mInflater = FaceVsFaceActivity.this.getLayoutInflater();
}
public void setData(List<FriendVO> data) {
mData = data;
this.notifyDataSetChanged();
}
@Override
public int getCount() {
if (mData != null)
return mData.size();
else
return 0;
}
@Override
public Object getItem(int position) {
return mData.get(position);
}
@Override
public long getItemId(int position) {
// TODO: If id is needed, change it
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
RowViewsHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.friend_row, parent, false);
holder = new RowViewsHolder(convertView);
convertView.setTag(holder); // Save inside view the holder.
} else {
holder = (RowViewsHolder) convertView.getTag();
}
FriendVO vo = mData.get(position);
holder.eventName.setText(vo.getName());
holder.eventImage.setImageResource(R.drawable.image);
return convertView;
}
}
private class RowViewsHolder {
private ImageView eventImage;
private TextView eventName;
public RowViewsHolder(View rowView) {
eventImage = (ImageView) rowView.findViewById(R.id.img_friend);
eventName = (TextView) rowView.findViewById(R.id.friend_name);
}
}
これにはどのような解決策がありますか?リストを使用すると(スクロール、クリック)、データが更新されているときにエラーが発生すると思います。少し助けてください。