无法将对象添加到FirebaseMessagingService的自定义列表视图中

时间:2017-08-17 18:24:33

标签: android list listview firebase firebase-cloud-messaging

最初,在设置自定义列表视图后,不再添加任何项目,即在列表视图中显示,尽管从FirebaseMessagingService添加了对象项目。 我已经声明了listView static,因此可以将Object添加到其他类或服务的列表中。 这是我的代码:

FirebaseMessagingService:

@Override
public void onMessageReceived(final RemoteMessage remoteMessage) {

    //Toast.makeText(getApplicationContext(), remoteMessage.getData().get("transaction"),Toast.LENGTH_SHORT).show();
    Handler handler = new Handler(Looper.getMainLooper());
    handler.post(new Runnable() {

        @Override
        public void run() {

            Gson gson = new Gson();
            Block  b = gson.fromJson(remoteMessage.getData().get("transaction"), Block.class);
            OpenChain.arrayList.add(b);
        }
    });
}

ListView活动代码:

public static ArrayList<Block> arrayList;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_open_chain);

    arrayList = new ArrayList<>();

    getSupportActionBar().setTitle("Vote Ledger");
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    ListView listView = (ListView) findViewById(R.id.listView);

    BlockchainAdap adap = new BlockchainAdap(this, arrayList);

    listView.setAdapter(adap);
    adap.notifyDataSetChanged();

}

**我以json格式从云端接收对象 **还能够从listview活动中添加对象,但不能从FirebaseMessagingSerivce

添加

1 个答案:

答案 0 :(得分:1)

  

我已经声明了listView static,因此可以将Object添加到   其他课程或服务的清单。

不是,一个很好的解决方案,你在这里泄漏 arrayList,因为当活动被破坏时它不会被垃圾收集。

更好的方法是在此方案中使用 LocalBroadCast

查看信息链接

https://developer.android.com/reference/android/support/v4/content/LocalBroadcastManager.html

现在,你做错了什么。你正在修改arraylist,但你没有通知适配器。

试试这个..

ShowCal:
    mes: 2
    cols: 7
    rows: 7

在FirebaseMessagingService

private ArrayList<Block> arrayList = new ArrayList<>();
private BlockchainAdap adap;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_open_chain);

    getSupportActionBar().setTitle("Vote Ledger");
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    ListView listView = (ListView) findViewById(R.id.listView);

    adap = new BlockchainAdap(this, arrayList);

    listView.setAdapter(adap);
}

public static void updateList(Block b){
   arrayList.add(b);
   adap.swap(arrayList);
}

此外,在** BlockchainAdap **中公开一个方法以进行交换。

@Override
public void onMessageReceived(final RemoteMessage remoteMessage) {
            Gson gson = new Gson();
            Block  b = gson.fromJson(remoteMessage.getData().get("transaction"), Block.class);
            OpenChain.updateList(b);   
}

这会有效,但请使用

  • 从消息传递服务到OpenChain活动的LocalBroadcastReceiver。
  • 使用RecyclerView而不是ListView。