我在一個單獨的線程(這是在一些其他類,這裏是整個問題是從網絡接收數據,但我不能把接收代碼放在活動類由於固有的複雜性遺留代碼 ),我想作爲接收到數據(實時)更新的ListView。對於我已經創建了一個ListView,ArratAdapter和一個ArrayList variavles ...以下是一些相關的代碼如何從一個單獨的類更改DayView的ListView?
public class LogInSuccessActivity extends Activity {
private String LOG_TAG = "LogInSuccessActivity";
private TextView welcomeTxtLbl = null;
private ListView buddyListView = null;
private ArrayAdapter<Buddy> buddyListAdapter = null;
// BuddyList
private ArrayList<Buddy> buddyList = null;
/*
* (non-Javadoc)
*
* @see android.app.Activity#onCreate(android.os.Bundle)
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.loginsuccess);
// get the TextView and ListView
welcomeTxtLbl = (TextView) findViewById(R.id.loginsuceeslbl);
buddyListView = (ListView) findViewById(R.id.buddylistview);
String uname = getIntent().getStringExtra("username");
if (uname != null) {
welcomeTxtLbl.setText("Welcome " + uname + ", Greetings!!");
} else {
welcomeTxtLbl.setText("SignIn successfull !!");
}
buddyList = new ArrayList<Buddy>();
buddyListAdapter = new ArrayAdapter<Buddy>(this,
android.R.layout.simple_list_item_1, buddyList);
buddyListView.setAdapter(buddyListAdapter);
// persist the context
ReceiverThread.loginSuccessActi = LogInSuccessActivity.this;
}
/*
* (non-Javadoc)
*
* @see android.app.Activity#onResume()
*
* @Override protected void onStart() { // TODO Auto-generated method stub
* super.onStart();
*
* }
*/
@Override
protected void onStop() {
super.onStop();
Log.e(LOG_TAG, "onStop is called ");
buddyListAdapter.clear();
buddyList.clear();
}
public void addBuddy(Buddy buddy) {
buddyList.add(buddy);
buddyListAdapter.notifyDataSetChanged();
}
Runnable updateTheListView = new Runnable() {
@Override
public void run() {
// synchronized (buddyList) {
buddyListAdapter.notifyDataSetChanged();
// }
}
};
public void refreshTheListView(Buddy buddy) {
System.out.println("Refreshing the ListView list size is : "
+ buddyList.size());
buddyList.add(buddy);
// buddyListAdapter.add(buddy);
// buddyListView.post(updateTheListView);
this.runOnUiThread(updateTheListView);
}
/*
* (non-Javadoc)
*
* @see android.app.Activity#onDestroy()
*/
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
Log.e(LOG_TAG, "onDestroy is called ");
super.onDestroy();
buddyList = null;
buddyListAdapter = null;
buddyListView = null;
ReceiverThread.loginSuccessActi = null;
}
}
現在從線程我會在每次收到新的Buddy時調用方法addBuddy()
...由於Receiver線程處於不同的類中,這是一種靜態方法...
該代碼無法正常工作,請給我一些建議以改進此代碼。我知道它不好,但由於缺乏對類似動作的知識,我不知道如何解決這個問題。我也讀到過有關DataSetObserver
可他們我的情況下使用..我在機器人競技場新手,所以請原諒我缺乏的基本概念....謝謝,
編輯 有一件事我忘了要提到的是,我不是從一個單獨的線程更新UI(我知道我不能),我所做的是每當Somedata(爲簡化問題當然我做所有過濾)到達時,我稱之爲addBuddy() ...
現在在UI線程上,我會調用ArrayAdapter的notifyDataSetChanged()
方法來進行視圖更新。
EDIT 2 以下是從哪裏接收數據另一個線程的代碼..
if (loginSuccessActi != null) {
loginSuccessActi.refreshTheListView(new Buddy(values));
// loginSuccessActi.addBuddy(new Buddy(values));
}
,我得到以下錯誤 適配器的內容發生了變化,但ListView控件沒有收到通知。
我想你需要展示更多的代碼才能得到更具體的問題診斷。你能否至少顯示接受新數據並調用addBuddy的代碼? – Louth
請參閱編輯,我已更改代碼.... – aProgrammer