最初,在设置自定义列表视图后,尽管从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 活动。
- 使用回收器视图而不是列表视图。