从不同的 activity 调用 adapter.notifyDataSetChanged

call adapter.notifyDataSetChanged from different activity

我对 android 编程还很陌生。我正在使用 socket.io 在 androd 中构建一个基本的聊天应用程序。我正在使用单例 class 在两个活动之间共享数据。我在第二个 activity 中有一个列表适配器,当我从服务器接收数据时,我想从第一个 activity 调用 adapter.notifyDataSetChanged();。这可能吗?

第activity:

mSocket.on("New", new Emitter.Listener() {
    @Override
    public void call(Object... args) {
        JSONObject temp = (JSONObject) args[0];
        Singleton.getInstance().AddMsg(temp);
        // I want to call the adapter defined in the second activity here. i.e. adapter.notifyDataSetChanged();

    }
});

注意几点:

  • adapter.notifyDataSetChanged(); 如果我从第 2 个 activity 调用它,它运行良好。
  • 1st activity 仅在应用程序启动时运行一次
  • 从第一个 activity 调用 notifyDataSetChanged() 没有意义,因为 ListView 在第二个 Activity 中。每当您通过意图打开第二个 activity 时,您应该将数据从第一个 activity 传输到第二个 activity,然后从第二个 activity 本身调用 notifyDataSetChanged()。

    不从第一个 activity 调用的原因是您不知道第二个 activity 是否可见。仅当相应列表在屏幕上可见时才更改适配器数据。不要从其他活动修改适配器。

    添加到@JyotmanSingh,您可以尝试在 activity 中创建套接字服务和回调处理程序来执行更新...

    You can do that by Broadcast

        mSocket.on("New", new Emitter.Listener() {
            @Override
            public void call(Object... args) {
                JSONObject temp = (JSONObject) args[0];
                Singleton.getInstance().AddMsg(temp);
                // I want to call the adapter defined in the second activity here. i.e. adapter.notifyDataSetChanged();
    
    
             // send broadcast that is added something
            Intent intent = new Intent("Added_something");
            //intent.putExtra("current speed", "102.4");
            //intent.putExtra("latitude", "12.2342342");
            //intent.putExtra("longitude", "12.21124");
            LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
    
    
            }
        });
    

    In SecondActivity

    像下面那样注册 BroadcastReceiver

    LocalBroadcastManager.getInstance(this).registerReceiver(message,
                    new IntentFilter("Added_something"));
    

    Declare BroadcastReceiver

        private BroadcastReceiver message = new BroadcastReceiver() {
    
    
            @Override
            public void onReceive(Context context, Intent intent) {
                // TODO Auto-generated method stub
       // refresh your adapter from SecondAdapter itself
            }
        };
    

    参考这个good tutorial for local brodacast