我得到這個錯誤與我的ListView:ListView錯誤 - java.lang.IllegalStateException
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
。
在我的應用程序中,我有一個ListView與CustomAdapter。
在onCreate方法我:
list = new ArrayList<FriendVO>();
mListView = (ListView) this.findViewById(R.id.listView1);
mFriendAdapter = new FriendAdapter(null);
mListView.setAdapter(mFriendAdapter);
我也有,從我的web服務中獲取數據,以填補我的ListView的AsyncHttpResponseHandler。 Everthing正常工作。在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);
}
}
有什麼能解決這個?我想我在使用列表時發生錯誤(滾動,單擊)並且數據正在更新。請一些幫助。
所以我做了改變。它不會給我同樣的錯誤,但現在有時它給了我另一個錯誤:java.lang.IndexOutOfBoundsException:無效的索引7,在「FriendVO vo = mData.get(position);」適配器中的大小爲0任何想法? –
你可以發佈「列表」的內容以及如何創建它?如果您不想公開這麼做,我已經回覆了您在Google+上的線索,可以向我發送有關環聊的消息 – Psest328
無論何時更改適配器的數據,您都應該在適配器上調用BaseAdapter.notifyDataSetChanged()。如果您不這樣做,則數據和Adapter認爲數據的內容不同,並且計數可能錯誤,從而導致ArrayOutOfBounds異常。 –