【发布时间】: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() 被调用了吗?