Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何将ListView从一个单独的类更改为Daynamically?_Android_Android Layout_Android Widget - Fatal编程技术网

Android 如何将ListView从一个单独的类更改为Daynamically?

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

我在一个单独的线程中接收来自网络的数据(这是在其他类中,这里的问题是,但是由于传统代码的内在复杂性,我不能将接收代码放入活动类中),我想在接收数据时更新ListView(实时)。。为此,我创建了一个ListView、ArratAdapter和一个ArrayList变量。。。下面是一些相关的代码

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()方法的线程中的一些设计问题
  • 将我的addBuddy方法更改为

    公共无效添加好友(最终好友){

  • 我还改变了应用程序的总体设计,因为我在搜索这个问题的答案时变得更聪明了。现在我使用Singelton类和静态变量共享数据。如果其他人将来有类似问题,以下链接可能会很有用


    对于那些有类似问题的人,最好的建议是“相信自己,你能做到。”

    我认为您需要显示更多的代码,以便对您的问题进行更具体的诊断。您至少可以显示接受新数据并调用
    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);
                    }
                });
    }