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



最初,在设置自定义列表视图后,尽管从FirebaseMessagingService添加了对象项,但不会再添加任何项目,即显示在列表视图中。 我已经声明了listView静态,以便可以将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);
}
});
}

列表视图活动代码:

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 格式的云对象 **还可以从列表视图活动中添加对象,但不能从FirebaseMessagingSerivce添加对象

我已经声明了listView静态,以便可以将对象添加到 从其他类或服务中列出。

不,一个好的解决方案,您在此处泄漏了arrayList,因为当活动被破坏时,它不会被垃圾回收。

更好的方法是在这种情况下使用LocalBroadCast

查看链接以获取信息

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

现在,你做错了什么。您正在修改数组列表,但您没有通知适配器。

试试这个..

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);
}

在 FirebaseMessagingService 中

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

另外,在你的** BlockchainAdap**中公开一个方法进行交换。

class BlockchainAdap {
ArrayList<Block> arrayList;
BlockchainAdap(ArrayList<Block> arrayList){
this.arrayList = arrayList;
}
public void swap(ArrayList<Block> arrayList){
this.arrayList = arrayList;
notifydatasetChanged();
}
// other methods
}

这将起作用,但使用

  • LocalBroadcastReceiver 从消息服务到 OpenChain 活动。
  • 使用回收器视图而不是列表视图。

相关内容

  • 没有找到相关文章