Android 如何将ListView从一个单独的类更改为Daynamically?
我在一个单独的线程中接收来自网络的数据(这是在其他类中,这里的问题是,但是由于传统代码的内在复杂性,我不能将接收代码放入活动类中),我想在接收数据时更新ListView(实时)。。为此,我创建了一个ListView、ArratAdapter和一个ArrayList变量。。。下面是一些相关的代码Android 如何将ListView从一个单独的类更改为Daynamically?,android,android-layout,android-widget,Android,Android Layout,Android Widget,我在一个单独的线程中接收来自网络的数据(这是在其他类中,这里的问题是,但是由于传统代码的内在复杂性,我不能将接收代码放入活动类中),我想在接收数据时更新ListView(实时)。。为此,我创建了一个ListView、ArratAdapter和一个ArrayList变量。。。下面是一些相关的代码 public class LogInSuccessActivity extends Activity { private String LOG_TAG = "LogInSuccessActivit
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;
}
}
我得到以下错误
适配器的内容已更改,但ListView未收到通知。您应该在android开发者网站上阅读
即使您在一个单独的线程上进行工作,也不能从另一个进程访问UI线程
解决这个问题的一种方法是实现一个执行工作的方法,然后通过
onPostExecute
方法更新适配器 在阅读了几乎所有关于SO的类似问题后,我最终通过以下步骤解决了它:-
对于那些有类似问题的人,最好的建议是“相信自己,你能做到。”我认为您需要显示更多的代码,以便对您的问题进行更具体的诊断。您至少可以显示接受新数据并调用
addBuddy
的代码。请查看编辑,我已更改了代码。。。。
if (loginSuccessActi != null) {
loginSuccessActi.refreshTheListView(new Buddy(values));
// loginSuccessActi.addBuddy(new Buddy(values));
}
Log.i(LOG_TAG, " ADDING BUDDY + " + buddy);
buddyListView.post(// UI thread ;
new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
synchronized (buddyList) {
buddyList.add(buddy);
buddyListAdapter.notifyDataSetChanged();
}
// buddyListAdapter.add(buddy);
}
});
}